51nod2934 Vote 善意的投票

☠2.02.02.0 秒 /// ☣262,144.0262,144.0262,144.0 KBKBKB /// ☢808080 分 /// ி555级题

注:本文或有许错误,各位客人可在评论区指出

51nod Vote 善意的投票

  • 51nod2934 Vote 善意的投票
    • 食物(题目)
      • 题目描述
      • 输入
      • 输出
      • 输入样例
      • 输出样例
      • 数据范围
    • 餐具(思路)
    • 正菜(代码)
    • 附录
      • 样例3

食物(题目)

题目描述

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

输入
  • 第一行只有两个整数 nnn,mmm,保证有 2≤n≤3002≤n≤3002≤n≤300,1≤m≤n(n−1)/21≤m≤n(n-1)/21≤m≤n(n−1)/2。其中 nnn 代表总人数,mmm 代表好朋友的对数。
  • 文件第二行有 nnn 个整数,第 iii 个整数代表第 iii 个小朋友的意愿,当它为111 时表示同意睡觉,当它为000 时表示反对睡觉。
  • 接下来文件还有m行,每行有两个整数 iii,jjj。表示 iii,jjj 是一对好朋友,我们保证任何两对 iii,jjj 不会重复
输出
  • 只需要输出一个整数,即可能的最小冲突数
输入样例
  • 输入样例1
3 3
1 0 0
1 2
1 3
3 2
  • 输入样例2
3 1
1 1 1
2 1
输出样例
  • 输出样例1
1
  • 输出样例2
0
数据范围
50%  : 2 <= n <= 15  2 <= m <= 35
70%  : 2 <= n <= 150 2 <= m <= 400
90%  : 2 <= n <= 200 2 <= m <= 5000
100% : 2 <= n <= 300 2 <= m <= 30000

餐具(思路)

这题很明显是一题最小割。
    题目要求让 (违背意愿的人数+好朋友之间的冲突数) 最小。
    我们就考虑让违背意愿的人和冲突的好朋友都付出大小为 1 的代价,那么只要计算代价的最小值即为答案。
    可以建立源点S和汇点T,我们考虑让最终源点一侧的割集代表选择同意睡觉的人,让汇点一侧的割集代表反对睡觉的人。
    然后源点S向代表最初同意睡觉的所有人对应的点连容量为1的边,反对睡觉的所有人对应的点向汇点T连容量为1的边,好朋友之间,对对方分别连容量为1的边。
    然后,求S到T的最小割,如果两个好朋友之间有边且最初的意愿不同,为了割断​,要么其中一人改变意愿(即割掉其与源点S或汇点T的边),要么他们之间发生冲突(即割断好朋友之间的一条单向边),无论哪种选择都会付出相应的代价。
    因此最终求出的最小割就是相应的最小代价。


正菜(代码)

#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#pragma GCC optimize(2)
using namespace std;int n,m,s,t;
int vis[351000],d[351000],cur[351000];
long long ans;
struct Edge
{int from,to,cap,flow;Edge(int u,int v,int c,int f):from(u),to(v),cap(c),flow(f) {};
};
vector<Edge> edges;
vector<int> G[350100];void add(int x,int y,int z)  //单向边
{edges.push_back(Edge(x,y,z,0));edges.push_back(Edge(y,x,0,0));int oo=edges.size();G[x].push_back(oo-2);G[y].push_back(oo-1);
}
void ad(int x,int y,int z)   //双向边
{edges.push_back(Edge(x,y,z,0));edges.push_back(Edge(y,x,z,0));int oo=edges.size();G[x].push_back(oo-2);G[y].push_back(oo-1);
}bool BFS()    //最小割模板
{memset(vis,0,sizeof(vis));queue<int> Q;Q.push(s);d[s]=0;vis[s]=1;while(!Q.empty()){int x=Q.front();Q.pop();for(int i=0;i<(int)(G[x].size());i++) {Edge& e=edges[G[x][i]];if(!vis[e.to]&&e.cap>e.flow){vis[e.to]=1;d[e.to]=d[x]+1;Q.push(e.to);}}}return vis[t];
}int DFS(int x,int a)    //最小割模板
{if(x==t||a==0) return a;int flow=0,f;for(int& i=cur[x];i<(int)(G[x].size());i++) {Edge& e=edges[G[x][i]];if(d[x]+1==d[e.to]&&(f=DFS(e.to,min(a,e.cap-e.flow)))>0){e.flow+=f;edges[G[x][i]^1].flow-=f;flow+=f;a-=f;if(a==0) break;}}return flow;
}int tdhf()    //最小割模板
{int flow=0,dx;while(BFS()){memset(cur,0,sizeof(cur));dx=DFS(s,1e9);while(dx) flow+=dx,dx=DFS(s,1e9);}return flow;
}
void read(int& x)  //快读(粗劣的快读)
{int f=1;x=0;char ch=getchar();while(ch<'0'||ch>'9') {if(ch=='-') f=-1; ch=getchar();}while(ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();}x*=f;
}
int main()
{int x,y;read(n),read(m);   //读入   s=n*3+1;t=s+1;     //S和T要开大点for(int i=1;i<=n;i++){read(x);if(x==1){add(i,t,1);}else {add(s,i,1);}}for(int i=1;i<=m;i++){read(x),read(y);ad(x,y,1);}printf("%d\n",tdhf());return 0;
}

附录

样例3
  • 输入样例3
7 19
1 1 1 1 0 1 0
1 2
3 1
1 4
5 1
1 6
1 7
3 2
2 5
6 2
2 7
3 4
3 5
6 3
3 7
4 6
7 4
5 6
7 5
6 7
  • 输出样例3
2

感谢大家支持!!!

51nod Vote 善意的投票相关推荐

  1. 【BZOJ2768】[JLOI2010]冠军调查/【BZOJ1934】[Shoi2007]Vote 善意的投票 最小割

    [BZOJ2768][JLOI2010]冠军调查 Description 一年一度的欧洲足球冠军联赛已经进入了淘汰赛阶段.随着卫冕冠军巴萨罗那的淘汰,英超劲旅切尔西成为了头号热门.新浪体育最近在吉林教 ...

  2. 【BZOJ 1934】 [Shoi2007]Vote 善意的投票

    1934: [Shoi2007]Vote 善意的投票 Time Limit: 1 Sec  Memory Limit: 64 MB Submit: 1205  Solved: 746 [Submit] ...

  3. bzoj 1934: [Shoi2007]Vote 善意的投票(最小割)

    1934: [Shoi2007]Vote 善意的投票 Time Limit: 1 Sec  Memory Limit: 64 MB Submit: 1796  Solved: 1094 [Submit ...

  4. bzoj1934【shoi2007】Vote善意的投票

    1934: [Shoi2007]Vote 善意的投票 Time Limit: 1 Sec  Memory Limit: 64 MB Submit: 1533  Solved: 942 [Submit] ...

  5. [bzoj1934][Shoi2007]Vote 善意的投票

    来自FallDream的博客,未经允许,请勿转载,谢谢. 幼儿园里有n个小朋友打算通过投票来决定睡不睡午觉.对他们来说,这个问题并不是很重要,于是他们决定发扬谦让精神.虽然每个人都有自己的主见,但是为 ...

  6. 1934: [Shoi2007]Vote 善意的投票

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

  7. Vote 善意的投票 HYSBZ - 1934

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

  8. ●BZOJ 1934 [Shoi2007]Vote 善意的投票

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1934 题解: 题目有点迷. S向为1的点连边,为0的点向T连边, 在有关系的两个点之间连双向 ...

  9. bzoj1934: [Shoi2007]Vote 善意的投票(最小割)

    传送门 考虑源点为同意,汇点为反对,那么只要源点向同意的连边,不同意的向汇点连边,求个最小割就是答案 然后考虑朋友之间怎么办,我们令朋友之间连双向边.这样不管怎么割都能对应一种选择情况.那么还是求一个 ...

最新文章

  1. cac会议投稿难度大吗_成考高升专难度大吗?考试通过率怎么样?
  2. FILA之后又有Amer,安踏能成为“世界的安踏”吗?
  3. Rxjs Observable.pipe 传入多个 operators 的执行逻辑分析
  4. python资源库——socket网络编程
  5. C语言输入数字出现相应答案,写一个函数 输入一个十六进制数,输出相应的十进制数。...
  6. WPF 打印不显示的元素
  7. python截图保存到内存卡_没有长截图功能,一招即可截下来!
  8. mysql同步三张表如何用事务_MySql-第三部分(外键, 多表连接, 事务,视图 )
  9. hive安装及常用命令
  10. 字符串转python对象
  11. IIS 6 元数据库与IIS 6 配置的兼容性 解决方案
  12. 穿越计算机的迷雾--读书笔记四
  13. java开发面试流程
  14. python清空文本框内容_js清空文本框
  15. sql分组排序,查询每组第一个数据
  16. 搭建FTP站点(Windows)
  17. CentOS7.6安装VNC
  18. poe工业以太网交换机可以当普通交换机用吗,poe工业以太网交换机有哪些优势
  19. BeautyGAN图片的高精度美颜
  20. Python爬虫,数据可视化之matplotlib初步--制作一个高楼高度的条形统计图全思路

热门文章

  1. Loj#6223 Luogu P4009 汽车加油行驶 分层图最短路
  2. 从园所“招生”和“提价”的需求切入,「掌通家园」要从工具转型成为平台...
  3. 百度贴吧推广技巧:故事型营销思维
  4. Rasa原文-编写对话数据
  5. 虚拟机 Linux 安装tds (一)
  6. IOS 图片点击放大不失真
  7. C++重载双目运算符
  8. 【计算机视觉】数字图像处理(六)—— 图像压缩
  9. 流浪汉的网络生存模式
  10. maven settings.xml文件