题目描述

幼儿园里有n个小朋友打算通过投票来决定睡不睡午觉。对他们来说,这个问题并不是很重要,于是他们决定发扬谦让精神。虽然每个人都有自己的主见,但是为了照顾一下自己朋友的想法,他们也可以投和自己本来意愿相反的票。我们定义一次投票的冲突数为好朋友之间发生冲突的总数加上和所有和自己本来意愿发生冲突的人数。

我们的问题就是,每位小朋友应该怎样投票,才能使冲突数最小?

输入输出格式

输入格式:

文件的第一行只有两个整数n,m,保证有2≤n≤300,1≤m≤n(n-1)/2。其中n代表总人数,m代表好朋友的对数。文件第二行有n个整数,第i个整数代表第i个小朋友的意愿,当它为1时表示同意睡觉,当它为0时表示反对睡觉。接下来文件还有m行,每行有两个整数i,j。表示i,j是一对好朋友,我们保证任何两对i,j不会重复。

输出格式:

只需要输出一个整数,即可能的最小冲突数。

输入输出样例

输入样例#1:

  1. 3 3
  2. 1 0 0
  3. 1 2
  4. 1 3
  5. 3 2
输出样例#1:

  1. 1

说明

2≤n≤300,1≤m≤n(n-1)/2。

题解:因为并没有要求统计最终情况,所以是水题啦。。。

要睡觉的i就add(s,i,1)否则add(i,t,1)

对于每一对意愿不同的小朋友a,b(a要睡觉b不要睡觉)add(a,b,1)

然后套板子。

  1. // It is made by XZZ
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<queue>
  5. #include<cstring>
  6. using namespace std;
  7. #define rep(a,b,c) for(int a=b;a<=c;a++)
  8. #define drep(a,b,c) for(int a=b;a>=c;a--)
  9. #define erep(a,b) for(rg int a=fir[b];a;a=nxt[a])
  10. #define il inline
  11. #define rg register
  12. #define vd void
  13. #define t (dis[i])
  14. typedef long long ll;
  15. il int gi(){
  16. rg int x=;rg char ch=getchar();
  17. while(ch<''||ch>'')ch=getchar();
  18. while(ch>=''&&ch<='')x=x*+ch-'',ch=getchar();
  19. return x;
  20. }
  21. const int maxn=,maxm=*,S=,T=;
  22. int fir[maxn],nxt[maxm],dis[maxm],w[maxm],id=;
  23. il vd add(int a,int b,int c){
  24. nxt[++id]=fir[a],fir[a]=id,dis[id]=b,w[id]=c;
  25. if(c)add(b,a,);
  26. }
  27. int dep[maxn];
  28. inline bool BFS() {
  29. int que[maxn],hd=,tl=;
  30. memset(dep,,sizeof dep);
  31. que[hd]=S;
  32. bool yes[maxn]= {};
  33. yes[S]=,dep[S]=;
  34. while(tl-hd) {
  35. int now=que[hd];
  36. for(int i=fir[now]; i; i=nxt[i])
  37. if(w[i]>&&!yes[t])
  38. yes[t]=,que[tl++]=t,dep[t]=dep[now]+;
  39. ++hd;
  40. }
  41. return yes[T];
  42. }
  43. inline int Dinic(int now,int h) {
  44. if(now==T)return h;
  45. int ans=;
  46. for(int i=fir[now]; i; i=nxt[i])
  47. if(w[i]>&&dep[t]==dep[now]+) {
  48. int D=Dinic(t,min(h,w[i]));
  49. w[i]-=D,w[i^]+=D,ans+=D,h-=D;
  50. if(h==)return ans;
  51. }
  52. return ans;
  53. }
  54. bool k[maxn];
  55. int main(){
  56. int n=gi(),m=gi();
  57. rep(i,,n){
  58. k[i]=gi();
  59. if(k[i])add(S,i,);
  60. else add(i,T,);
  61. }
  62. rep(i,,m){
  63. int a=gi(),b=gi();
  64. if(k[a]^k[b]){
  65. if(k[a])add(a,b,);
  66. else add(b,a,);
  67. }
  68. }
  69. int flow=;
  70. while(BFS())flow+=Dinic(S,);
  71. printf("%d\n",flow);
  72. return ;
  73. }

[洛谷P2057][bzoj1934]善意的投票(最大流)的更多相关文章

  1. 洛谷 P2057 [SHOI2007]善意的投票 解题报告

    P2057 [SHOI2007]善意的投票 题目描述 幼儿园里有n个小朋友打算通过投票来决定睡不睡午觉.对他们来说,这个问题并不是很重要,于是他们决定发扬谦让精神.虽然每个人都有自己的主见,但是为了照 ...

  2. 洛谷P2057 [SHOI2007]善意的投票 题解

    题目链接: https://www.luogu.org/problemnew/show/P2057 分析: 由0和1的选择我们直觉的想到0与S一堆,1与T一堆. 但是发现,刚开始的主意并不一定是最终的 ...

  3. [洛谷P2057][SHOI2007]善意的投票

    题目大意:有$n(n\leqslant300)$个人,每个人可以选择$0$或$1$,每个人最开始有意愿,有$m(m\leqslant\dfrac{n(n-1)}2)$对好朋友.定义一次的冲突数为好朋友 ...

  4. 洛谷$P2057\ [SHOI2007]$ 善意的投票 网络流

    正解:网络流 解题报告: 传送门! $umm$看到每个人要么0要么1就考虑最小割呗,,,? 然后贡献有两种?一种是违背自己的意愿,一种是和朋友的意愿违背了 所以考虑开一排点分别表示每个人,然后$S$表 ...

  5. P2057 [SHOI2007]善意的投票 (最大流)

    题目 P2057 [SHOI2007]善意的投票 解析 网络流的建模都如此巧妙. 我们把同意的意见看做源点\(s\),不同意的意见看做汇点\(t\). 那我们\(s\)连向所有同意的人,\(t\)连向 ...

  6. 洛谷P2057 【SHOI2007】善意的投票

    洛谷P2057 [SHOI2007]善意的投票 题目链接 这道题是最小割的一个经典应用:划分集合. 题目的意思就是就是将所有的小朋友分为两个集合:同意睡觉和不同意睡觉的.不同的集合之间的边都要断开. ...

  7. P2057 [SHOI2007]善意的投票 / [JLOI2010]冠军调查

    P2057 [SHOI2007]善意的投票 / [JLOI2010]冠军调查 拿来练网络流的qwq 思路:如果i不同意,连边(i,t,1),否则连边(s,i,1).好朋友x,y间连边(x,y,1)(y ...

  8. 洛谷P4014 分配问题【最小/大费用流】题解+AC代码

    洛谷P4014 分配问题[最小/大费用流]题解+AC代码 题目描述 有 n 件工作要分配给 n 个人做.第 i 个人做第 j 件工作产生的效益为c ij. 试设计一个将 n 件工作分配给 n 个人做的 ...

  9. 洛谷 P2057 善意的投票(网络流最小割)

    P2057 善意的投票 题目描述 幼儿园里有n个小朋友打算通过投票来决定睡不睡午觉.对他们来说,这个问题并不是很重要,于是他们决定发扬谦让精神.虽然每个人都有自己的主见,但是为了照顾一下自己朋友的想法 ...

随机推荐

  1. 使用linux远程登录另一台linux

    可以用ssh命令行方式登录.对方需要开启ssh服务.   ssh [-l login_name] [-p port] [user@]hostname   例如,使用root用户登录 192.168.0 ...

  2. 触发器 视图 存储过程 mysql常用函数

                                                                                                        ...

  3. windows server 2016 无法联网问题

    首先,联网分解为两个问题,一.WLAN(无线网).二.以太网(有线网) 一 .WLAN问题解决方案 1.打开服务器管理器 2.添加角色和功能 3.一直点下一步到“功能”,勾选 DirectPlay 和 ...

  4. for 与forEach的区别

    for循环 for循环,通过下标,对循环中的代码反复执行,功能强大,可以通过index取得元素.在处理比较复杂的处理的时候较为方便. foreach循环 foreach,从头到尾,对于集合中的对象遍历 ...

  5. ZT 输入一个字符串,查找它的第一个数字串,并返回其个数

    /*查找字符串中的数字串问题 输入一个字符串,查找它的第一个数字串,并返回其个数 */ #include <stdio.h> char firstnum(char *input,char ...

  6. [2018HN省队集训D5T1] 沼泽地marshland

    [2018HN省队集训D5T1] 沼泽地marshland 题意 给定一张 \(n\times n\) 的棋盘, 对于位置 \((x,y)\), 若 \(x+y\) 为奇数则可能有一个正权值. 你可以 ...

  7. 17:54 思维导图coggle布置好了

    钱不是好赚的,要赚钱就要冒险,就会有损失.为了家庭还是旱涝保收一点好,没有现金流什么都是白搭,通过博客来学习也是件不错的是,问题是我现在完全没有想法,比如冒泡算法什么的,没有概念,背不出来,其实可以推 ...

  8. [DAViCHi/SeeYa/T-ARA][원더우먼][Wonder Woman]

    歌词来源:http://music.163.com/#/song?id=5371229 作曲 : 赵英秀 [作曲 : 赵英秀] [作曲 : 赵英秀] 作词 : K-Smith [作词 : KSmith ...

  9. 第七周:Python

    python的应用场景 重复性的东西编写脚本 和对于大数据量的操作 数据搭建的环境 不建议自己在网上找下载,建议下载anaconda,可在清华镜像里面下载anaconda,下载安装之后可在桌面上找到程 ...

  10. 3282. Tree【LCT】

    Description 给定N个点以及每个点的权值,要你处理接下来的M个操作. 操作有4种.操作从0到3编号.点从1到N编号. 0:后接两个整数(x,y),代表询问从x到y的路径上的点的权值的xor和 ...