洛谷 P2057 [SHOI2007]善意的投票 解题报告
P2057 [SHOI2007]善意的投票
题目描述
幼儿园里有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不会重复。
输出格式:
只需要输出一个整数,即可能的最小冲突数。
说明
2≤n≤300,1≤m≤n(n-1)/2。
最小割模型题,一开始建模建费用流死活建不出来。
它有个名字,叫做二者取一式问题,感性描述为,将分为两类的点的点集一分为二,每类点需要代价达到另一集合或者不达到,其中一些点处于不同集合可能产生一些代价,求最小代价。
对应此题,我们把S代表0点集合,T代表1点集合,我们需要把点分别分进S,T所属集合,如果把朋友连的边切断,就说明他们分属两类集合,产生一个冲突,把原本要去S的点直接与S相连,如果这个边被切断,对应为被隔向另一个集合,产生冲突1。转换到最小割模型上了。
code:
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int N=502;
int to[N*N],next[N*N],w[N*N],cnt=1,head[N];
void add(int u,int v,int c)
{
next[++cnt]=head[u];to[cnt]=v;head[u]=cnt;w[cnt]=c;
}
int s[N],dep[N],tot=0,used[N],n,m,typ[N],pre[N];
queue <int > q;
bool bfs()
{
while(!q.empty()) q.pop();
q.push(0);
memset(dep,0,sizeof(dep));
dep[0]=1;
while(!q.empty()&&q.front()!=n+1)
{
int now=q.front();
q.pop();
for(int i=head[now];i;i=next[i])
{
if(!dep[to[i]]&&w[i])
{
dep[to[i]]=dep[now]+1;
q.push(to[i]);
}
}
}
return !q.empty();
}
int main()
{
scanf("%d%d",&n,&m);
int ans=0;
for(int i=1;i<=n;i++)
{
scanf("%d",typ+i);
if(typ[i]) add(0,i,1),add(i,0,0);
else add(i,n+1,1),add(n+1,i,0);
}
int u,v;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&u,&v);
add(u,v,typ[u]),add(v,u,typ[v]);
}
while(bfs())
{
s[++tot]=0;
memset(used,0,sizeof(used));
memset(pre,0,sizeof(pre));
while(tot)
{
if(s[tot]==n+1)
{
for(int i=tot;i>1;i--)
{
w[pre[s[i]]]-=1;
w[pre[s[i]]^1]+=1;
}
tot=0;
ans++;
}
else
{
int u=s[tot];
for(int i=head[u];i;i=next[i])
{
if(dep[to[i]]==dep[u]+1&&w[i]&&!used[to[i]])
{
s[++tot]=to[i];
pre[s[tot]]=i;
used[to[i]]=1;
break;
}
}
if(u==s[tot]) tot--;
}
}
}
printf("%d\n",ans);
return 0;
}
2018.6.16
洛谷 P2057 [SHOI2007]善意的投票 解题报告的更多相关文章
- 洛谷$P2057\ [SHOI2007]$ 善意的投票 网络流
正解:网络流 解题报告: 传送门! $umm$看到每个人要么0要么1就考虑最小割呗,,,? 然后贡献有两种?一种是违背自己的意愿,一种是和朋友的意愿违背了 所以考虑开一排点分别表示每个人,然后$S$表 ...
- 洛谷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][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 ...
- 洛谷 P1361 小M的作物 解题报告
P1361 小M的作物 题目描述 小M在MC里开辟了两块巨大的耕地\(A\)和\(B\)(你可以认为容量是无穷),现在,小\(P\)有\(n\)中作物的种子,每种作物的种子有1个(就是可以种一棵作物) ...
- 洛谷 P2323 [HNOI2006]公路修建问题 解题报告
P2323 [HNOI2006]公路修建问题 题目描述 输入输出格式 输入格式: 在实际评测时,将只会有m-1行公路 输出格式: 思路: 二分答案 然后把每条能加的大边都加上,然后加小边 但在洛谷的题 ...
- P2057 [SHOI2007]善意的投票 最小割
$ \color{#0066ff}{ 题目描述 }$ 幼儿园里有n个小朋友打算通过投票来决定睡不睡午觉.对他们来说,这个问题并不是很重要,于是他们决定发扬谦让精神.虽然每个人都有自己的主见,但是为了照 ...
随机推荐
- CQOI2018简要题解
CQOI2018简要题解 D1T1 破解 D-H 协议 题意 Diffie-Hellman 密钥交换协议是一种简单有效的密钥交换方法.它可以让通讯双方在没有事先约定密钥(密码)的情况下,通过不安全的信 ...
- 如何写好一篇高质量的IEEE/ACM Transaction级别的计算机科学论文?
转自<知乎>如何写好一篇高质量的IEEE/ACM Transaction级别的计算机科学论文? 问题: 作为一个博士生,一直为写论文头疼,读过很多高质量论文,觉得写的真好,但是轮到自己写总 ...
- Linux内核及分析 第三周 Linux内核的启动过程
实验过程: 打开shell终端,执行以下命令: cd LinuxKernel/ qemu -kernel linux-3.18.6/arch/x86/boot/bzImage-initrd rootf ...
- 第六次作业-my Backlog
杨灵超小组 My Backlog 小学生四则运算自动生成(Backlog) ID Name IMP EST How to Demo ...
- 3-Python3从入门到实战—基础之数据类型(数字-Number)
Python从入门到实战系列--目录 Python3 中有六个标准的数据类型: Number(数字) String(字符串) List(列表) Tuple(元组) Sets(集合) Dictionar ...
- 『编程题全队』Beata阶段项目复审
小组的名字和链接 优点 缺点,bug 报告(部分包括建议) 最终名次 想不出队名 1. 界面简洁大方2. 有搜索功能 1. 已经完成的活动缺了点提示界面2. 似乎界面有一点点卡顿目标实现:基本实现找到 ...
- mybatis 框架网站
http://www.mybatis.org/mybatis-3/zh/index.html
- What is the best Java email address validation method?
https://stackoverflow.com/questions/624581/what-is-the-best-java-email-address-validation-method htt ...
- 防止xss攻击。
function htmlEscape(text){ return text.replace(/[<>&\"=]/g,function(match,pos,origina ...
- DVWA的安装与简单使用
参考资料: http://www.freebuf.com/articles/web/119150.html 尝试使用linux机器安装,但是因为下载php版本以及各种兼容性的问题耗时较长, 所以后来选 ...