bzoj 1934 善意的投票
题目大意:
每个人可以选择睡不睡午觉 给出他们原本的意愿 以及m对朋友表示他们之间应当选择相同 求好朋友之间发生冲突的总数加上和所有和自己本来意愿发生冲突的人数
思路:
每个意愿不同的人分别连向源和汇 对于一对朋友之间连边 这样最小割即可
1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cmath> 5 #include<algorithm> 6 #include<cstring> 7 #include<vector> 8 #include<queue> 9 #include<complex> 10 #include<map> 11 #define rep(i,s,t) for(register int i=(s);i<=(t);++i) 12 #define dwn(i,s,t) for(register int i=(s);i>=(t);--i) 13 #define ren for(register int i=fst[x];i;i=nxt[i]) 14 #define Fill(x,t) memset(x,t,sizeof(x)) 15 #define ll long long 16 #define Cd complex<double> 17 #define inf 2139062143 18 #define MOD 998244353 19 #define MAXN 310 20 #define MAXM 90100 21 using namespace std; 22 inline int read() 23 { 24 int x=0,f=1;char ch=getchar(); 25 while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();} 26 while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();} 27 return x*f; 28 } 29 int n,m,S,T; 30 struct Dinic 31 { 32 int fst[MAXN],cur[MAXN],nxt[MAXM<<1],to[MAXM<<1],val[MAXM<<1]; 33 int vis[MAXN],dep[MAXN],tot,cnt,q[MAXN],l,r; 34 void mem(){memset(fst,0,sizeof(fst));cnt=1;} 35 void add(int u,int v,int w){nxt[++cnt]=fst[u],fst[u]=cnt,to[cnt]=v,val[cnt]=w;} 36 void ins(int u,int v,int w){add(u,v,w);add(v,u,0);} 37 int bfs() 38 { 39 q[l=r=1]=T,vis[T]=++tot,dep[T]=0;int x; 40 while(l<=r) 41 { 42 x=q[l++]; 43 ren if(val[i^1]&&vis[to[i]]!=tot) {vis[to[i]]=tot,dep[to[i]]=dep[x]+1,q[++r]=to[i];if(to[i]==S)return 1;} 44 } 45 return vis[S]==tot; 46 } 47 int dfs(int x,int now) 48 { 49 if(x==T||!now) return now; 50 int flow=0,f; 51 for(int& i=cur[x];i;i=nxt[i]) 52 if(val[i]&&dep[to[i]]==dep[x]-1&&(f=dfs(to[i],min(now,val[i])))) 53 {now-=f,flow+=f,val[i]-=f,val[i^1]+=f;if(!now) break;} 54 return flow; 55 } 56 int solve() 57 { 58 int ans=0,f; 59 while(bfs()) {memcpy(cur,fst,sizeof(cur));while(f=dfs(S,inf)) ans+=f;} 60 return ans; 61 } 62 }D; 63 int main() 64 { 65 n=read(),m=read(),S=0,T=n+1;D.mem();int a,b;rep(i,1,n) {a=read();if(a) D.ins(S,i,1);else D.ins(i,T,1);} 66 rep(i,1,m) a=read(),b=read(),D.ins(a,b,1),D.ins(b,a,1); 67 printf("%d\n",D.solve()); 68 }