洛谷 P2057 善意的投票
题目描述
幼儿园里有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不会重复。
输出格式:
只需要输出一个整数,即可能的最小冲突数。
输入输出样例
3 3 1 0 0 1 2 1 3 3 2
1
说明
2≤n≤300,1≤m≤n(n-1)/2。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
(网络流)割~
先建一个源点0,一个汇点n+1,对于所有同意的点,从0连边;所有不同意的点,向汇点连边,然后朋友之间连双向边,跑一遍割点即可~
T到飞起,后来才发现是因为数组开小了……无力吐槽……
(现在才分清楚割和割点,好神奇啊~)
#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
using namespace std;int n,m,x,y,fi[120010],ne[120010],w[120010],v[120010],cnt,ans,now,dis[120010];int read()
{int f=1,totnum=0;char s=getchar();while(s<'0' || s>'9') {if(s=='-') f=-1;s=getchar();}while(s>='0' && s<='9') {totnum=totnum*10+s-'0';s=getchar();}return f*totnum;
}void add(int u,int vv,int val)
{w[++cnt]=vv;v[cnt]=val;ne[cnt]=fi[u];fi[u]=cnt;w[++cnt]=u;v[cnt]=-val;ne[cnt]=fi[vv];fi[vv]=cnt;
}bool bfs()
{queue<int> q;q.push(0);dis[0]=1;while(!q.empty()){int k=q.front();q.pop();for(int i=fi[k];i;i=ne[i])if(!dis[w[i]] && v[i]>0){dis[w[i]]=dis[k]+1;q.push(w[i]);if(w[i]==n) return 1;}}return 0;
}int dfs(int u,int vv)
{if(u==n) return vv;int kkz;for(int i=fi[u];i;i=ne[i])if(v[i]>0 && dis[u]+1==dis[w[i]] && (kkz=dfs(w[i],min(vv,v[i])))){v[i]-=kkz;v[i^1]+=kkz;return kkz;}return 0;
}int main()
{n=read();m=read();n++;cnt=1;for(int i=1;i<n;i++){x=read();if(x) add(0,i,1);else add(i,n,1);}while(m--){x=read();y=read();add(x,y,1);add(y,x,1);}while(bfs())while(now=dfs(0,999999999)) ans+=now;printf("%d\n",ans);return 0;
}
洛谷 P2057 善意的投票相关推荐
- 洛谷P2057 【SHOI2007】善意的投票
洛谷P2057 [SHOI2007]善意的投票 题目链接 这道题是最小割的一个经典应用:划分集合. 题目的意思就是就是将所有的小朋友分为两个集合:同意睡觉和不同意睡觉的.不同的集合之间的边都要断开. ...
- [洛谷P2057][SHOI2007]善意的投票
题目大意:有$n(n\leqslant300)$个人,每个人可以选择$0$或$1$,每个人最开始有意愿,有$m(m\leqslant\dfrac{n(n-1)}2)$对好朋友.定义一次的冲突数为好朋友 ...
- 洛谷 - P2057 [SHOI2007]善意的投票 / [JLOI2010]冠军调查(最大流最小割)
题目链接:点击查看 题目大意:有 n 个人,每个人都有两种意见,且有许多朋友,需要让朋友之间的意见尽可能统一,问最少有多少冲突 题目分析:因为每个人有两种意见,所以分别将其与源点和汇点相连,因为最后可 ...
- [Luogu P2057] 善意的投票
Luogu 类型:最小割 我们可以把两者不同的意见看做两个集合,两个集合中间有边连接. 一个st-cut(简称割cut)会把有向图的顶点分成两个不相交的集合,其中s在一个集合中,t在另外一个集合中. ...
- P2057 [SHOI2007]善意的投票 (最大流最小割)
P2057 [SHOI2007]善意的投票 / [JLOI2010]冠军调查 最小割,两种意见可以看作源点S和T,我们需要做的是割最少的边使得S和T成为两个不同的集合,解释:割掉的边相当于1次冲突(因 ...
- 【洛谷月赛】洛谷三月月赛题解报告
昨天就是洛谷三月月赛,小编考的并不好,才31分,隔壁大佬50分,于是小编决定改一改题,先看第一题: P5238 整数校验器 题目描述 有些时候需要解决这样一类问题:判断一个数 x 是否合法. x 合法 ...
- 洛谷 P8313 [COCI2021-2022#4] Izbori
PS:如果读过题了可以跳过题目描述直接到题解部分 提交链接:洛谷 P8313 [COCI2021-2022#4] Izbori 题目 题目描述 Malnar 先生正在竞选县长,这个县一共有 nnn 栋 ...
- 洛谷题目B3617:古籍翻译,八进制转十六进制C++实践。
这是我第一次写博客,还是个小学生,希望大家多多谅解. 原题选自洛谷(luogu.com.cn),题目在这里. 目录 题目介绍: 输入格式 输出格式 输入输出样例 至此,问题就被分成了两部分: 第一部分 ...
- 洛谷-题解 P2672 【推销员】
独门思路!链表加优先队列! 这题一望,贪心是跑不掉了,但是我贪心并不好,所以想到了一个复杂一些但思路更保稳的做法 思路: 1 因为是离线操作,所以我们可以倒着求,先求x=n的情况,因为那样直接就知道了 ...
最新文章
- 《Cacti实战》——第2章 环境的安装和配置
- inner join on, left join on, right join on要详细点的介绍?内连接,左外连接,右外连接。...
- IE滤镜实现透明度/阴影/渐变等特效
- android 图片压缩
- 将ListT集合用DataGridView展示
- SQL基础【十八、事物】(sql事物慎用,还是写业务逻辑代码好一些,入伙涉及到更换数据啥的很麻烦!)
- lcd取模如何取16位_两种方式实现取16位变量的高低8位, 不严谨对比
- 安装linux6.10 I386系统教程,一看就懂的Centos6.10安装教程
- SpringBoot2.1.9 多MongoDB配置
- java中逗号怎么加_Java中如何将字符串从右至左每三位加一逗号
- Mysql 学习笔记08
- 我们每天努力上班赚钱,财富离我们很远
- 新浪Xweibo 皮肤制作
- Alexa Top 1000 在中国的访问情况
- 最小径集的算法_最小割集Stoer-Wagner算法 | 学步园
- 阿里云盾技术强在哪里?轻松防御DDoS、CC攻击 1
- mysql创建表报错1055的原因_[Err] 1055
- 家装软件相关算法和技术归纳
- iSCSI target initiator
- DCOS之k8s的容器监测探针