幼儿园里有n个小朋友打算通过投票来决定睡不睡午觉。对他们来说,这个问题并不是很重要,于是他们决定发扬谦让精神。虽然每个人都有自己的主见,但是为了照顾一下自己朋友的想法,他们也可以投和自己本来意愿相反的票。我们定义一次投票的冲突数为好朋友之间发生冲突的总数加上和所有和自己本来意愿发生冲突的人数。
我们的问题就是,每位小朋友应该怎样投票,才能使冲突数最小?
这道题的思想就是最大流=最小割,改变一个注意就相当于是割去一条边,割边最少就是流最大,所以是网络流问题
至于建图,就是同意的连S,不同意连T,如果两个人是朋友,再连一条双向边,套上网络流模板就OK了
int main() {
n=read(),m=read();
s=n+1,t=n+2;
for(int i=1;i<=n;++i) {
int x=read();
if(x==1) add(s,i,1);
else add(i,t,1);
}
for(int i=1;i<=m;++i) {
int u=read(),v=read();
add(u,v,1),add(v,u,1);
}
while(bfs()) {
while(ans=dinic(s,(1<<29)))
sum+=ans;
}
printf("%d",sum);
return 0;
}