洛谷P2057 【SHOI2007】善意的投票
洛谷P2057 【SHOI2007】善意的投票
这道题是最小割的一个经典应用:划分集合。
题目的意思就是就是将所有的小朋友分为两个集合:同意睡觉和不同意睡觉的。不同的集合之间的边都要断开。
我们设\(S\)为投票结果为不想睡觉的小朋友(颜色为0)的集合;\(T\)为投票结果为想睡觉的小朋友(颜色为1)的集合。然后对于一个小朋友\(i\),设他的“颜色”为x,那么我们就连两条边\((S,i,[x!=0]),(i,T,[x!=1])\)。第一条边表示该小朋友属于\(S\)集合,第二条边表示该小朋友属于\(T\)集合。
因为投与自己意愿相反的票会产生冲突,所以需要给定流量。
然后对于一对好朋友\(i,j\),我们连\((i,j,1)\)的双向边。
实际操作中,流量为0的边自然可以不连。
答案就是最小割。这是因为,如果\(S\)和\(T\)之间还有流量,说明还有至少一对有冲突的好朋友存在。从这个角度来想,那么答案和最小割等价的。
如果要问最后小朋友们投的是那些票,那就看最小割割的是哪些边。如果割的是\((i,j)\),表示保留冲突。如果割的是\((s,i)\)或\((i,T)\),表示\(i\)投了意愿相反的票。
代码:
#include<bits/stdc++.h>
#define ll long long
#define N 305
using namespace std;
inline int Get() {int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}while('0'<=ch&&ch<='9') {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;}
int n,m;
int S,T;
struct load {
int to,next;
int flow;
}s[N*N<<2];
int h[N],cnt=1;
void add(int i,int j,int flow) {
s[++cnt]=(load) {j,h[i],flow};h[i]=cnt;
s[++cnt]=(load) {i,h[j],0};h[j]=cnt;
}
int dis[N],gap[N];
int dfs(int v,int maxf) {
if(v==T) return maxf;
int ret=0;
for(int i=h[v];i;i=s[i].next) {
int to=s[i].to;
if(s[i].flow&&dis[to]+1==dis[v]) {
int dlt=dfs(to,min(maxf-ret,s[i].flow));
s[i].flow-=dlt;
s[i^1].flow+=dlt;
ret+=dlt;
if(ret==maxf||dis[S]>=n+2) return ret;
}
}
if(!(--gap[dis[v]])) dis[S]=n+2;
gap[++dis[v]]++;
return ret;
}
int sap() {
memset(gap,0,sizeof(gap));
memset(dis,0,sizeof(dis));
gap[0]=n+2;
int ans=0;
while(dis[S]<n+2) ans+=dfs(S,1<<29);
return ans;
}
void Init() {
cnt=1;
memset(h,0,sizeof(h));
}
int main() {
n=Get(),m=Get();
Init();
T=n+1;
for(int i=1;i<=n;i++) {
int a=Get();
if(a==1) add(S,i,1);
else add(i,T,1);
}
for(int i=1;i<=m;i++) {
int a=Get(),b=Get();
add(a,b,1),add(b,a,1);
}
cout<<sap()<<"\n";
return 0;
}
洛谷P2057 【SHOI2007】善意的投票的更多相关文章
- 洛谷 P2057 [SHOI2007]善意的投票 解题报告
P2057 [SHOI2007]善意的投票 题目描述 幼儿园里有n个小朋友打算通过投票来决定睡不睡午觉.对他们来说,这个问题并不是很重要,于是他们决定发扬谦让精神.虽然每个人都有自己的主见,但是为了照 ...
- 洛谷P2057 [SHOI2007]善意的投票 题解
题目链接: https://www.luogu.org/problemnew/show/P2057 分析: 由0和1的选择我们直觉的想到0与S一堆,1与T一堆. 但是发现,刚开始的主意并不一定是最终的 ...
- [洛谷P2057][SHOI2007]善意的投票
题目大意:有$n(n\leqslant300)$个人,每个人可以选择$0$或$1$,每个人最开始有意愿,有$m(m\leqslant\dfrac{n(n-1)}2)$对好朋友.定义一次的冲突数为好朋友 ...
- 洛谷$P2057\ [SHOI2007]$ 善意的投票 网络流
正解:网络流 解题报告: 传送门! $umm$看到每个人要么0要么1就考虑最小割呗,,,? 然后贡献有两种?一种是违背自己的意愿,一种是和朋友的意愿违背了 所以考虑开一排点分别表示每个人,然后$S$表 ...
- [洛谷P2057][bzoj1934]善意的投票(最大流)
题目描述 幼儿园里有n个小朋友打算通过投票来决定睡不睡午觉.对他们来说,这个问题并不是很重要,于是他们决定发扬谦让精神.虽然每个人都有自己的主见,但是为了照顾一下自己朋友的想法,他们也可以投和自己本来 ...
- P2057 [SHOI2007]善意的投票 (最大流)
题目 P2057 [SHOI2007]善意的投票 解析 网络流的建模都如此巧妙. 我们把同意的意见看做源点\(s\),不同意的意见看做汇点\(t\). 那我们\(s\)连向所有同意的人,\(t\)连向 ...
- P2057 [SHOI2007]善意的投票 / [JLOI2010]冠军调查
P2057 [SHOI2007]善意的投票 / [JLOI2010]冠军调查 拿来练网络流的qwq 思路:如果i不同意,连边(i,t,1),否则连边(s,i,1).好朋友x,y间连边(x,y,1)(y ...
- P2057 [SHOI2007]善意的投票 最小割
$ \color{#0066ff}{ 题目描述 }$ 幼儿园里有n个小朋友打算通过投票来决定睡不睡午觉.对他们来说,这个问题并不是很重要,于是他们决定发扬谦让精神.虽然每个人都有自己的主见,但是为了照 ...
- Luogu P2057 [SHOI2007]善意的投票
题目链接 \(Click\) \(Here\) 考虑模型转换.变成文理分科二选一带收益模型,就一波带走了. 如果没有见过这个模型的话,这里讲的很详细. #include <bits/stdc++ ...
- 【题解】Luogu P2057 [SHOI2007]善意的投票
原题传送门 我们一眼就能看出这是一道最小割的题 我们设不睡觉这种状态为S,睡觉这种状态为T 对于每个人,如果不想睡觉,就从S向这个人连流量为1的边,否则,就从这个人向T连流量为1的边 对于每一对朋友, ...
随机推荐
- 分布式计算框架Spark
Apache Spark是一个开源分布式运算框架,最初是由加州大学柏克莱分校AMPLab所开发. Hadoop MapReduce的每一步完成必须将数据序列化写到分布式文件系统导致效率大幅降低.Spa ...
- IdentityServer4 中文文档 -4- (简介)打包和构建
IdentityServer4 中文文档 -4- (简介)打包和构建 原文:http://docs.identityserver.io/en/release/intro/packaging.html ...
- c# 检测是否有Sql非法字符
/// <summary> /// 检测是否有Sql危险字符 /// </summary> /// <param name="str">要判断字 ...
- sort、sorted高级排序-Python3.7 And 算法<七>
1.sort(*, key=None, reverse=False) sort()接受两个参数,这两个参数只能通过关键字(关键字参数)传递. 参数key:带一个参数的函数(排序时,会依次传入列表的每一 ...
- 【RabbitMQ】4、RabbitMQ几种Exchange 模式
AMQP协议中的核心思想就是生产者和消费者隔离,生产者从不直接将消息发送给队列.生产者通常不知道是否一个消息会被发送到队列中,只是将消息发送到一个交换机.先由Exchange来接收,然后Exchang ...
- Rarely executed and almost empty if statement drastically reduces performance in C++
Question: Editor's clarification: When this was originally posted, there were two issues: Test perfo ...
- HDU3987(最小割最少割边)
Harry Potter and the Forbidden Forest Time Limit: 5000/3000 MS (Java/Others) Memory Limit: 65536/ ...
- oracle数据库相关概念介绍
数据库相关概念介绍: 问题: 数据存储:变量(基本类型,引用类型) 基本类型:少量数据 引用类型:保证数据的完整性 数据源: 声明直接赋值 IO流从硬盘中读取 java在处理数据时,需要从硬盘中读取数 ...
- python 通过 pip 更新所有已安装的包
较新的 pip 已经支持 list --outdated 了,所以记录一下新的方法: pip list --outdated --format=legacy |awk '{print $1}' |xa ...
- 【代码笔记】Web-JavaScript-JavaScript注释
一,效果图. 二,代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...