bzoj 2330: [SCOI2011]糖果

神奇的差分约束??百度写的很明白(感觉其实就一句话有用)

 1 #include<bits/stdc++.h>
 2 #define N 200005
 3 #define LL long long
 4 #define inf 0x3f3f3f3f
 5 #define ls tr[x][0]
 6 #define rs tr[x][1]
 7 using namespace std;
 8 inline int ra()
 9 {
10     int x=0,f=1; char ch=getchar();
11     while (ch<'0' || ch>'9') {if (ch=='-') f=-1; ch=getchar();}
12     while (ch>='0' && ch<='9') {x=x*10+ch-'0'; ch=getchar();}
13     return x*f;
14 }
15 struct node{
16     int to,next,v;
17 }e[N<<1];
18 int head[N],cnt,q[N<<2],tot[N],n,m;
19 bool inq[N];
20 int dis[N]; LL ans;
21 void insert(int x, int y, int v)
22 {
23     e[++cnt].to=y; e[cnt].next=head[x]; e[cnt].v=v; head[x]=cnt;
24 }
25 bool SPFA()
26 {
27     int l=0,r=1; q[0]=0; inq[0]=1; tot[0]=1;
28     while (l<r)
29     {
30         int x=q[l++];
31         for (int i=head[x];i;i=e[i].next)
32             if (dis[e[i].to]<dis[x]+e[i].v)
33             {
34                 dis[e[i].to]=dis[x]+e[i].v;
35                 if (++tot[e[i].to]>=n) return 0;
36                 if (!inq[e[i].to])
37                 {
38                     inq[e[i].to]=1;
39                     q[r++]=e[i].to;
40                 }
41             }
42         inq[x]=0;
43     }
44     return 1;
45 }
46 int main()
47 {
48     n=ra(); m=ra();
49     for (int i=1; i<=m; i++)
50     {
51         int opt=ra(),a=ra(),b=ra();
52         if (opt==1) insert(b,a,0),insert(a,b,0);
53         if (opt==2) {
54             if (a==b) {puts("-1"); return 0;}
55                 else insert(a,b,1);
56         }
57         if (opt==3) insert(b,a,0);
58         if (opt==4){
59             if (a==b) {puts("-1"); return 0;}
60                 else insert(b,a,1);
61         }
62         if (opt==5) insert(a,b,0);
63     }
64     for (int i=n; i>=1; i--) insert(0,i,1);
65     if (!SPFA()) {puts("-1"); return 0;}
66     for (int i=1; i<=n; i++) ans+=(LL)dis[i];
67     cout<<ans;
68     return 0;
69 } 

 

posted @ 2017-03-01 08:20  ws_ccd  阅读(155)  评论(0编辑  收藏  举报