码迷,mamicode.com
首页 > 其他好文 > 详细

BZOJ2330[SCOI2011]糖果

时间:2016-09-01 23:02:17      阅读:219      评论:0      收藏:0      [点我收藏+]

标签:

差分约束第二题

传送门:

这个的模型很清楚,具体的建模可以参考代码。

一个需要注意的点。如果题目中有d[i]==d[j]的地方,只需要连两个边权为0的双向边就行了。

 

 1 //BZOJ 2330
 2 //by Cydiater
 3 //2016.9.1
 4 #include <iostream>
 5 #include <cstdio>
 6 #include <cstring>
 7 #include <string>
 8 #include <algorithm>
 9 #include <queue>
10 #include <map>
11 #include <ctime>
12 #include <cmath>
13 #include <cstdlib>
14 #include <iomanip>
15 using namespace std;
16 #define ll long long
17 #define up(i,j,n)       for(int i=j;i<=n;i++)
18 #define down(i,j,n)     for(int i=j;i>=n;i--)
19 const int MAXN=1e6+5;
20 const int oo=0x3f3f3f3f;
21 inline int read(){
22     char ch=getchar();int x=0,f=1;
23     while(ch>9||ch<0){if(ch==-)f=-1;ch=getchar();}
24     while(ch>=0&&ch<=9){x=x*10+ch-0;ch=getchar();}
25     return x*f;
26 }
27 int N,K,f[MAXN],LINK[MAXN],len=0,dis[MAXN],q[MAXN<<1],head,tail,cnt[MAXN];ll ans=0;
28 bool vis[MAXN];
29 struct query{
30     int op,x,y;
31 }Q[MAXN];
32 struct edge{
33     int y,next,v;
34 }e[MAXN];
35 namespace solution{
36     inline void insert(int x,int y,int v){e[++len].next=LINK[x];LINK[x]=len;e[len].y=y;e[len].v=v;}
37     void init(){
38         N=read();K=read();
39         up(i,1,N)f[i]=i;
40         up(i,1,K){
41             Q[i].op=read();Q[i].x=read();Q[i].y=read();
42         }
43         up(i,1,K){
44             int op=Q[i].op,x=Q[i].x,y=Q[i].y;
45             if(op==1){insert(x,y,0);insert(y,x,0);}
46             if(op==2)insert(x,y,1);
47             if(op==3)insert(y,x,0);
48             if(op==4)insert(y,x,1);
49             if(op==5)insert(x,y,0);
50             if(op%2==0&&x==y){
51                 puts("-1");
52                 exit(0);
53             }
54         }
55         down(i,N,1)insert(0,i,1);
56     }
57     void SPFA(){
58         head=1;tail=0;
59         memset(vis,0,sizeof(vis));
60         memset(cnt,0,sizeof(cnt));
61         up(i,0,N)dis[i]=-oo;
62         vis[0]=0;dis[0]=0;
63         q[++tail]=0;
64         for(;head<=tail;head++){
65             int node=q[head];
66             for(int i=LINK[node];i;i=e[i].next)
67                 if(dis[e[i].y]<dis[node]+e[i].v){
68                     dis[e[i].y]=dis[node]+e[i].v;
69                     if(!vis[e[i].y]){
70                         if(cnt[e[i].y]==N){
71                             puts("-1");
72                             exit(0);
73                         }
74                         q[++tail]=e[i].y;
75                         vis[e[i].y]=1;
76                         cnt[e[i].y]++;
77                     }
78                 }
79             vis[node]=0;
80         }
81     }
82     void output(){
83         up(i,1,N)ans+=dis[i];
84         cout<<ans<<endl;
85     }
86 }
87 int main(){
88     //freopen("input.in","r",stdin);
89     using namespace solution;
90     init();
91     SPFA();
92     output();
93     return 0;
94 }

 

BZOJ2330[SCOI2011]糖果

标签:

原文地址:http://www.cnblogs.com/Cydiater/p/5831549.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!