洛谷P2057 [SHOI2007]善意的投票 题解
题目链接:
https://www.luogu.org/problemnew/show/P2057
分析:
由0和1的选择我们直觉的想到0与S一堆,1与T一堆。
但是发现,刚开始的主意并不一定是最终的结果。
于是用源点S表示最终选择0的集合。
汇点T表示最终选择1的集合。
如果一个人P选择了0,那么S−>PS->PS−>P连一条流量为1的边,然后P−>TP->TP−>T连一条流量为0的边。
反之如果P选择了1,那么S−>PS->PS−>P连一条流量为0的边,然后P−>TP->TP−>T连一条流量为1的边。
最后把所有朋友对之间连流量为1的双向边(关系相互)
代码:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
#include<queue>
#define inf 0x7fffffff
using namespace std;
int s,t,ans;
int d[505];
struct edge
{int to,val,rev;edge(int _to,int _val,int _rev){to=_to;val=_val;rev=_rev;}
};
vector<edge>e[505];
void add(int x,int y,int w)
{e[x].push_back(edge(y,w,e[y].size()));e[y].push_back(edge(x,0,e[x].size()-1));
}
bool bfs()
{queue<int>q; memset(d,-1,sizeof(d));d[s]=0;q.push(s);while(!q.empty()){int x=q.front();q.pop();for(int i=0;i<e[x].size();i++){int y=e[x][i].to;if(d[y]==-1&&e[x][i].val){q.push(y);d[y]=d[x]+1;}}} if(d[t]==-1)return 0;return 1;
}
int dfs(int x,int low)
{if(x==t || low==0)return low;int totflow=0; for(int i=0;i<e[x].size();i++){int y=e[x][i].to;int rev=e[x][i].rev;if(d[y]==d[x]+1 && e[x][i].val){int a=dfs(y,min(low,e[x][i].val)); e[x][i].val-=a;e[y][rev].val+=a;low-=a;totflow+=a;if(low==0) return totflow;}}if(low!=0) d[x]=-1;return totflow;
}void dinic()
{while(bfs()){//printf("%d\n",ans); ans+=dfs(s,inf); }
}
int main()
{int n,m,x,y,o;scanf("%d%d",&n,&m);s=0;t=500;for(int i=1;i<=n;i++){scanf("%d",&o);if(o==0){add(s,i,1);//add(i,t,0);}else{//add(s,i,0);add(i,t,1);}}for(int i=1;i<=m;i++){scanf("%d%d",&x,&y);add(x,y,1);add(y,x,1);}dinic();printf("%d\n",ans);return 0;
}
转载于:https://www.cnblogs.com/ShineEternal/p/10834224.html
洛谷P2057 [SHOI2007]善意的投票 题解相关推荐
- [洛谷P2057][SHOI2007]善意的投票
题目大意:有$n(n\leqslant300)$个人,每个人可以选择$0$或$1$,每个人最开始有意愿,有$m(m\leqslant\dfrac{n(n-1)}2)$对好朋友.定义一次的冲突数为好朋友 ...
- 洛谷 - P2057 [SHOI2007]善意的投票 / [JLOI2010]冠军调查(最大流最小割)
题目链接:点击查看 题目大意:有 n 个人,每个人都有两种意见,且有许多朋友,需要让朋友之间的意见尽可能统一,问最少有多少冲突 题目分析:因为每个人有两种意见,所以分别将其与源点和汇点相连,因为最后可 ...
- P2057 [SHOI2007]善意的投票 (最大流最小割)
P2057 [SHOI2007]善意的投票 / [JLOI2010]冠军调查 最小割,两种意见可以看作源点S和T,我们需要做的是割最少的边使得S和T成为两个不同的集合,解释:割掉的边相当于1次冲突(因 ...
- P2057 [SHOI2007]善意的投票 最小割
题意大致就是有n个人有两种不同的意见并且有许多朋友,需要让朋友间尽可能的统一意见(少发生冲突),如果一个人违反自己的本意也算冲突,求最少的冲突... 很明显是最小割 跑最大流算出冲突数 两种意见可 ...
- 洛谷P2057 【SHOI2007】善意的投票
洛谷P2057 [SHOI2007]善意的投票 题目链接 这道题是最小割的一个经典应用:划分集合. 题目的意思就是就是将所有的小朋友分为两个集合:同意睡觉和不同意睡觉的.不同的集合之间的边都要断开. ...
- 洛谷P5520 [yLOI2019] 青原樱 题解
洛谷P5520 [yLOI2019] 青原樱 题解 题目链接:P5520 [yLOI2019] 青原樱 题意: n n n 个空放 m m m 个物品,两两物品不能直接相邻,至少空一格 纯数学题. 看 ...
- 洛谷P5633 最小度限制生成树 题解
洛谷P5633 最小度限制生成树 题解 题目链接:P5633 最小度限制生成树 题意: 给你一个有 n n n 个节点, m m m 条边的带权无向图,你需要求得一个生成树,使边权总和最小,且满足编号 ...
- 洛谷P2619 [国家集训队]Tree I 题解
洛谷P2619 [国家集训队]Tree I 题解 题目链接:P2619 [国家集训队]Tree I 题意: 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有 need\text{n ...
- 洛谷P1282 多米诺骨牌 题解
洛谷P1282 多米诺骨牌 题解 题目链接:P1282 多米诺骨牌 题意: 多米诺骨牌由上下 222 个方块组成,每个方块中有 1∼61\sim61∼6 个点.现有排成行的上方块中点数之和记为 S1S ...
- 洛谷P4084 [USACO17DEC]Barn Painting G 题解
洛谷P4084 [USACO17DEC]Barn Painting G 题解 题目链接:P4084 [USACO17DEC]Barn Painting G 题意:题意:给定一颗N个节点组成的树,3种颜 ...
最新文章
- IO流(六)之CharArrayReader类与CharArrayWriter类
- Hsiaoyang: Google与站点地图Sitemap
- OpenCV C++ 04 - Change Brightness
- c#中的long类型示例_C#中带示例的无符号字节数组
- java中Decimaformat_Java中 DecimalFormat 用法详解
- 信息学奥赛一本通(2029:【例4.15】水仙花数)
- Oracle数据库安装图解
- Bash、Terminal通过tab忽略大小写自动补全命令行提示
- 基于Node.js + WebSocket 的简易聊天室
- C#用正则表达式对IP进行排序
- 再谈System.arraycopy和Arrays.copyOf
- 【致远FAQ】致远OA启动不起来了(下集)
- 阿里巴巴电话面试(遭到了阿里的完虐,被一顿痛批)
- 如何远程控制Mac电脑(MacOS下远程控制详解)
- 可视化工具 roto 3t
- oracle耳机,新手耳机选购排行榜出炉,这三款耳机不仅做工精细,音质还能打
- vue 移动端音乐(3) amp;amp;gt;热门歌单推荐部分(webpack-dev-conf.js做后端接口代理+scroll插件)
- 华为fusion computer虚拟机存储数据恢复
- JavaWeb学习总结——JavaWEB_Servlet(尚硅谷_佟刚老师)
- xlrd和xlwt操作Excel文件
热门文章
- LINUX编译libusb
- doubango TURN Data Indication报文代码
- configure: error: Can‘t find ext2fs library
- 把一个byte高低位进行交换
- JS:如何正确绘制文字
- 2021-0413梦笔记
- cl.exe is unable to create an executable file. C compiler test failed.
- Python3不需要uuid:导入/usr/local/lib/python3.x/site-packages/uuid.py提示if not 0 time_low 32L错误
- 诚心劝言:自养动物不杀
- 错误解决:src/cpp/cuda.hpp: fatal error: cuda.h