BZOJ2330[SCOI2011]糖果
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BZOJ2330[SCOI2011]糖果相关的知识,希望对你有一定的参考价值。
差分约束第二题
这个的模型很清楚,具体的建模可以参考代码。
一个需要注意的点。如果题目中有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]糖果的主要内容,如果未能解决你的问题,请参考以下文章