标签:
在第一个例子中,所有小朋友都投赞成票就能得到最优解
1 #include<cstdio> 2 #include<cstring> 3 #include<cmath> 4 #include<iostream> 5 using namespace std; 6 const int inf=100000000,N=310; 7 struct ee{int to,next,f;}e[N*N*2]; 8 int head[N],q[N*2],dis[N],x[N]; 9 int S,T,n,m,cnt=1,ans,w; 10 11 void ins(int u,int v,int f){ 12 e[++cnt].to=v;e[cnt].f=f;e[cnt].next=head[u];head[u]=cnt; 13 e[++cnt].to=u;e[cnt].f=0;e[cnt].next=head[v];head[v]=cnt; 14 } 15 16 bool bfs(){ 17 for (int i=1;i<=T;i++) dis[i]=inf; 18 int h=0,t=1,now; 19 q[1]=S;dis[S]=0; 20 while(h!=t){ 21 now=q[++h]; 22 for (int i=head[now];i;i=e[i].next){ 23 int v=e[i].to; 24 if (e[i].f&&dis[now]+1<dis[v]){ 25 dis[v]=dis[now]+1; 26 if (v==T)return 1; 27 q[++t]=v; 28 } 29 } 30 } 31 if (dis[T]==inf) return 0; return 1; 32 } 33 34 int dinic(int now,int f){ 35 if (now==T) return f; 36 int rest=f; 37 for (int i=head[now];i;i=e[i].next){ 38 int v=e[i].to; 39 if (e[i].f&&dis[v]==dis[now]+1&&rest){ 40 int t=dinic(v,min(rest,e[i].f)); 41 if (!t) dis[v]=0; 42 e[i].f-=t; 43 e[i^1].f+=t; 44 rest-=t; 45 //if(t) printf("%d %d %d\n",now,v,e[i].f); 46 } 47 } 48 return f-rest; 49 } 50 int main(){ 51 scanf("%d%d",&n,&m); 52 S=0,T=n+1; 53 for (int i=1;i<=n;i++) { 54 scanf("%d",&x[i]); 55 if (x[i]==0) ins(S,i,1),ins(i,T,0); 56 else ins(S,i,0),ins(i,T,1); 57 } 58 int u,v; 59 for (int i=1;i<=m;i++){ 60 scanf("%d%d",&u,&v); 61 ins(u,v,1);ins(v,u,1); 62 } 63 while (bfs()) ans+=dinic(S,inf); 64 printf("%d",ans); 65 }
【BZOJ 1934】 [Shoi2007]Vote 善意的投票
标签:
原文地址:http://www.cnblogs.com/wuminyan/p/5189858.html