【bzoj2330】: [SCOI2011]糖果 图论-差分约束-SPFA

【bzoj2330】: [SCOI2011]糖果

恩。。就是裸的差分约束。。

x=1 -> (A,B,0) (B,A,0)

x=2 -> (A,B,1)  [这个情况加个A==B无解的要特判]

x=3 -> (B,A,0)  [恩这个是不少于一开始zz建反了]

x=4 -> (B,A,1)

x=5 -> (A,B,0)

然后源点到所有点建1的边[恩据说有条链所以要反着连]跑最长路就好了

 1 /* http://www.cnblogs.com/karl07/ */
 2 #include <cstdlib>
 3 #include <cstdio>
 4 #include <cstring>
 5 #include <cmath>
 6 #include <algorithm>
 7 #include <queue>
 8 using namespace std;
 9
10 const int N=100005;
11 struct edge{
12     int next,to,v;
13 }e[N*4];
14
15 int n,k,ade=0;
16 int first[N],dis[N],vis[N],tim[N];
17 queue <int> q;
18
19 void addedge(int x,int y,int v){
20     e[++ade].to=y;
21     e[ade].next=first[x];
22     e[ade].v=v;
23     first[x]=ade;
24 }
25
26 #define s e[x].to
27 #define v e[x].v
28 long long spfa(){
29     q.push(n+1),vis[n+1]=1;
30     while (!q.empty()){
31         int p=q.front();
32         q.pop(),vis[p]=0;
33         for (int x=first[p];x;x=e[x].next){
34             if (dis[s]<dis[p]+v){
35                 dis[s]=dis[p]+v;
36                 if (!vis[s]) vis[s]=1,q.push(s);
37                 tim[s]++;
38             }
39             if (tim[s]>n+1) return -1;
40         }
41     }
42     long long ans=0;
43     for (int i=1;i<=n;i++) ans+=dis[i];
44     return ans;
45 }
46 #undef v
47 #undef s
48
49 int main(){
50     scanf("%d%d",&n,&k);
51     for (int i=1,a,b,x;i<=k;i++){
52         scanf("%d%d%d",&x,&a,&b);
53         if (x==1) addedge(a,b,0),addedge(b,a,0);
54         if (x==2) if (a==b) {puts("-1"); return 0;} else addedge(a,b,1);
55         if (x==3) addedge(b,a,0);
56         if (x==4) if (a==b) {puts("-1"); return 0;} else addedge(b,a,1);
57         if (x==5) addedge(a,b,0);
58     }
59     for (int i=n;i>=1;i--) addedge(n+1,i,1);
60     printf("%lld\n",spfa());
61     return 0;
62 }
63  

蒟蒻退役前两天又开始更博客了。。期中考试和地理二模两个星期啥也没干。。然后明天就SHOI了。。

时间: 2024-11-05 03:09:09

【bzoj2330】: [SCOI2011]糖果 图论-差分约束-SPFA的相关文章

[luoguP3275] [SCOI2011]糖果(差分约束)

传送门 差分约束裸题 但是坑! 有一个点是长为10W的链,需要逆序加边才能过(真是玄学) 还有各种坑爹数据 开longlong ——代码 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #define N 200001 5 6 int n, k, cnt; 7 long long ans, dis[N]; 8 int head[N], to[N << 1], val[N <

Luogu3275 [SCOI2011]糖果 (差分约束)(未完成)

#include <cstdio> #include <iostream> #include <cstring> #include <algorithm> #include <cmath> #define R(a,b,c) for(register int a = (b); (a) <= (c); ++(a)) #define nR(a,b,c) for(register int a = (b); (a) >= (c); --(a))

POJ 3169 Layout (图论-差分约束)

Layout Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6574   Accepted: 3177 Description Like everyone else, cows like to stand close to their friends when queuing for feed. FJ has N (2 <= N <= 1,000) cows numbered 1..N standing along a

POJ 1201 Intervals(图论-差分约束)

Intervals Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 20779   Accepted: 7863 Description You are given n closed, integer intervals [ai, bi] and n integers c1, ..., cn. Write a program that: reads the number of intervals, their end po

uva 11478 Halum(图论-差分约束)

  Problem H Halum Time Limit : 3 seconds   You are given a directed graph G(V,E) with a set of vertices and edges. Each edge (i,j) that connects some vertex i to vertex j has an integer cost associated with that edge. Define the operation Halum(v, d)

POJ 3169 Layout (差分约束+SPFA)

Layout Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6832   Accepted: 3292 Description Like everyone else, cows like to stand close to their friends when queuing for feed. FJ has N (2 <= N <= 1,000) cows numbered 1..N standing along a

ZOJ 2770 Burn the Linked Camp 差分约束+SPFA

第一道正儿八经的差分约束题 有排成一列的n个点,首先告诉你每个点的值最多是多少(最少显然要大于0),然后告诉你m段i,j,k,表示第i个点到第j个点的值的和至少有k,问你总和至少为多少. 要注意的是,告诉你的所有关系式都不要忘记建边,一开始漏了大于0的条件调半天o(╯□╰)o 不等式的形式是a-b<=c这样的= = 1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 #include <

BZOJ 2330 [SCOI2011]糖果 差分约束spfa版

题意:自行百度,(之前做过一道candy的升级版). 方法:差分约束 解析:最近在学差分约束什么的,这道是做的第一个bz上的题,感觉还是较简单的.以下我对5种操作进行描述. case 转换不等式 转换不等式2 1 A>=0+B B>=0+A 2 B>=1+A 3 A>=0+B 4 A>=1+B 5 B>=0+A 如上表按照差分约束的原理加边,然后再观察上表不等式方向->为求大边,即最长路. 这些边是不够的,所有人应最少为1糖果,即创出个源点到各点距离为1. 后记:

bzoj2330: [SCOI2011]糖果 差分约束

这题有毒.首先显然是差分约束裸题,然而n,m<=1e5,并且有两个数据如下: 1.有负环的大数据.由于spfa判负环是o(nm)的,所以这个点要跑5s.然而这个点存在负的自环,可以直接判掉…… 2.1->2->...->n的一条链.若1先入队,则可以一次更新完.否则每次编号较小的点会把所有编号大于它的点都重新更新一次,就卡到了o(n^2).若一般的边表按1->n加边,入队顺序就是n->1.面向数据地,可以倒着加边,或者按1->n先把所有点入队. 有一个tarjan