题目大意:有$n(n\leqslant300)$个人,每个人可以选择$0$或$1$,每个人最开始有意愿,有$m(m\leqslant\dfrac{n(n-1)}2)$对好朋友。定义一次的冲突数为好朋友之间发生冲突的总数加上和自己本来意愿发生冲突的人数。

题解:最小割,源点向原意愿为$0$的点连边,原意愿为$1$的向汇点连边,好朋友之间连边。但如果转换为最大流,好朋友之间要连双向边(不然一个人换选择了就会挂,其实想想,连单向边的话谁连谁?)

卡点:

C++ Code:

#include <algorithm>
#include <cstdio>
#define maxn 310
#define maxm (maxn * maxn / 2 + maxn * 2)
const int inf = 0x3f3f3f3f;namespace Network_Flow {int head[maxn], lst[maxn], cnt = 1;struct Edge {int to, nxt, w;} e[maxm << 1];inline void addedge(int a, int b, int c = 1, int d = 0) {e[++cnt] = (Edge) { b, head[a], c }; head[a] = cnt;e[++cnt] = (Edge) { a, head[b], d }; head[b] = cnt;}int st, ed, n, MF;int GAP[maxn], d[maxn];int q[maxn], h, t;void init() {GAP[d[q[h = t = 0] = ed] = 1] = 1;for (int i = st; i <= ed; ++i) lst[i] = head[i];while (h <= t) {int u = q[h++];for (int i = head[u], v; i; i = e[i].nxt) {v = e[i].to;if (!d[v]) {++GAP[d[v] = d[u] + 1];q[++t] = v;}}}}int dfs(int u, int low) {if (!low || u == ed) return low;int w, res = 0;for (int &i = lst[u], v; i; i = e[i].nxt) {v = e[i].to;if (d[u] == d[v] + 1) {w = dfs(v, std::min(low, e[i].w));res += w, low -= w;e[i].w -= w, e[i ^ 1].w += w;if (!low) return res;}}if (!--GAP[d[u]]) d[st] = n + 1;++GAP[++d[u]], lst[u] = head[u];return res;}void ISAP(int S, int T) {st = S, ed = T, n = T - S + 1;init();while (d[st] <= n) MF += dfs(st, inf);}
}
using Network_Flow::addedge;int n, m;
int main() {scanf("%d%d", &n, &m);int st = 0, ed = n + 1;for (int i = 1, x; i <= n; ++i) {scanf("%d", &x);if (x) addedge(st, i);else addedge(i, ed);}for (int i = 0, a, b; i < m; ++i) {scanf("%d%d", &a, &b);addedge(a, b, 1, 1);}Network_Flow::ISAP(st, ed);printf("%d\n", Network_Flow::MF);return 0;
}

  

转载于:https://www.cnblogs.com/Memory-of-winter/p/10347046.html

[洛谷P2057][SHOI2007]善意的投票相关推荐

  1. 洛谷 - P2057 [SHOI2007]善意的投票 / [JLOI2010]冠军调查(最大流最小割)

    题目链接:点击查看 题目大意:有 n 个人,每个人都有两种意见,且有许多朋友,需要让朋友之间的意见尽可能统一,问最少有多少冲突 题目分析:因为每个人有两种意见,所以分别将其与源点和汇点相连,因为最后可 ...

  2. P2057 [SHOI2007]善意的投票 (最大流最小割)

    P2057 [SHOI2007]善意的投票 / [JLOI2010]冠军调查 最小割,两种意见可以看作源点S和T,我们需要做的是割最少的边使得S和T成为两个不同的集合,解释:割掉的边相当于1次冲突(因 ...

  3. P2057 [SHOI2007]善意的投票 最小割

    题意大致就是有n个人有两种不同的意见并且有许多朋友,需要让朋友间尽可能的统一意见(少发生冲突),如果一个人违反自己的本意也算冲突,求最少的冲突... 很明显是最小割   跑最大流算出冲突数 两种意见可 ...

  4. 洛谷P2057 【SHOI2007】善意的投票

    洛谷P2057 [SHOI2007]善意的投票 题目链接 这道题是最小割的一个经典应用:划分集合. 题目的意思就是就是将所有的小朋友分为两个集合:同意睡觉和不同意睡觉的.不同的集合之间的边都要断开. ...

  5. 洛谷 P2057 善意的投票

    题目描述 幼儿园里有n个小朋友打算通过投票来决定睡不睡午觉.对他们来说,这个问题并不是很重要,于是他们决定发扬谦让精神.虽然每个人都有自己的主见,但是为了照顾一下自己朋友的想法,他们也可以投和自己本来 ...

  6. 洛谷 - P2163 [SHOI2007]园丁的烦恼(不带修二维数点-树状数组/主席树)

    题目链接:点击查看 题目大意:二维平面坐标系中给出 nnn 个坐标点,然后是 mmm 次询问,每次询问需要回答一个闭合矩阵中有多少个点 题目分析:想挂树套树来着,但是复杂度有点大.本题不带修且可以离线 ...

  7. 洛谷 P2163 [SHOI2007]园丁的烦恼 (离线sort,树状数组,解决三维偏序问题)

    P2163 [SHOI2007]园丁的烦恼 题目描述 很久很久以前,在遥远的大陆上有一个美丽的国家.统治着这个美丽国家的国王是一个园艺爱好者,在他的皇家花园里种植着各种奇花异草. 有一天国王漫步在花园 ...

  8. 洛谷 P2163 [SHOI2007]Tree 园丁的烦恼

    此题树状数组卡常好题(滑稽) 题目描述 很久很久以前,在遥远的大陆上有一个美丽的国家.统治着这个美丽国家的国王是一个园艺爱好者,在他的皇家花园里种植着各种奇花异草.有一天国王漫步在花园里,若有所思,他 ...

  9. SHOI2007善意的投票

    水题 最小割问题 考察什么? 冲突. 这种题不是没有过啊 有一个就是激光打别人的就是利用这个思想(搞忘做题解了,结果没权限了WOC) 利用S-T表示若联通则依旧有冲突 把S表示赞成,T表示不赞成 赞成 ...

最新文章

  1. 一 Struts2 开发流程
  2. 前端学习(2566):vue的生命周期
  3. CString,int,string,char*之间的转换(转)
  4. WINDOWS 下安装boost
  5. H5炫酷特效系列4——炫酷粒子变化特效
  6. 在一头扎进机器学习前应该知道的那些事儿 1
  7. Windows 10 安装SVN 不显示状态图标--解决方法
  8. [转]xcode免证书调试
  9. 中南大学《实验室安全与环保知识》
  10. 拼多多店铺等级怎么提升?店盈通来告诉你
  11. Photoshop 有什么技巧让你相见恨晚?
  12. 用 javascript 解释 curry
  13. 新车 合格证 二维码 解密
  14. 值得收藏|基于全球切片解析标准TMS的瓦片规则
  15. R语言中的表达式函数
  16. 论文复现—1—A Simple yet Effective Relation Information Guided Approach for Few-Shot Relation Extraction
  17. CAD图纸转换TIFF格式时修改背景颜色
  18. 什么是线程阻塞?为什么会出现线程阻塞?
  19. 70个数据分析常用网址,我先收藏了!
  20. 苹果首席设计师艾维将离职开办新公司 还会开发苹果产品

热门文章

  1. mysql选定数据库_mysql数据库学习――2,数据库的选定,创建,删除和变更_MySQL...
  2. flask从服务器获取html页面,flask的ajax、获取服务器数据、放到前端页面、如果数据存在显示标签、如果不存在不显示标签...
  3. 基于SSVEP-EOG的混合BCI用于机械臂控制
  4. J2SE基础常见面试题目
  5. 千米感知误差低于5%,嬴彻发布全球领先的超长距精准3D感知技术
  6. WPF Dispatcher介绍
  7. Lottie开源动画库
  8. NSStirng、NSArray、以及枚举(Method小集合)
  9. MySQL组内排序取最大值
  10. 理解Linux中断 (2)【转】