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. c++ array容器 传参_华东理工:氮和氧共掺杂的分级多孔碳,用于超级电容器的电极材料...
  2. 谨慎的Waymo CEO:未来几十年,自动驾驶无法做到无处不在
  3. 《ArcGIS Runtime SDK for Android开发笔记》——(2)、Android Studio基本配置与使用
  4. 网络欺骗工具Ettercap大学霸IT达人
  5. ubuntu下wps无法使用搜狗输入法输入中文
  6. DOS 批处理命令学习1
  7. tf 从RNN到BERT
  8. boost::pfr::for_each_field相关的测试程序
  9. AbstractQueuedSynchronizer的介绍和原理分析
  10. 有mysql文件怎么运行不了_MySQL安装常见问题(找不到文件,系统服务无法启动...)...
  11. 安卓动态调试七种武器之离别钩 – Hooking(下)
  12. 学python电脑要装什么_初学 Python 需要安装哪些软件?
  13. Mysql设置某字段唯一
  14. php 按钮美化,input(file)按钮样式美化第二种
  15. 图像处理一之-摄像头二值化处理-(什么是二值化)
  16. 调试Linux OpenWrt 2.6.36+华为ME909s-821 4G模块
  17. python 定义一个迭代器去生成偶数数列
  18. 二值图像连通区域标记
  19. 我为什么放弃java学习Kotlin?
  20. plg.Polygon

热门文章

  1. 纯Go实现的Firebase的替代品 | Gopher Daily (2021.08.11) ʕ◔ϖ◔ʔ
  2. 刘慈欣回应《三体》获奖nbsp;对…
  3. tailwindcss 官网(六)定制:配置( `tailwind.config.js `、-p、important、核心插件、`resolveConfig`)、主题 `theme` 配置
  4. BT种子破案,FBI可以,你也行
  5. eclipse安装red5插件
  6. React开发环境准备
  7. Thingsboard 简单教程:使用 ThingsBoard 查看物联网数据
  8. TMMi测试能力成熟度模型简介
  9. RPLIDAR A2 rviz显示雷达数据教程
  10. php修改excel表格数据,php修改excel表格数据-php怎么导入Excel表格到数据库,根据表格内的字段......