【SHOI 2007】善意的投票
Problem
Description
幼儿园里有 \(n\) 个小朋友打算通过投票来决定睡不睡午觉。对他们来说,这个问题并不是很重要,于是他们决定发扬谦让精神。虽然每个人都有自己的主见,但是为了照顾一下自己朋友的想法,他们也可以投和自己本来意愿相反的票。我们定义一次投票的冲突数为好朋友之间发生冲突的总数加上和所有和自己本来意愿发生冲突的人数。
我们的问题就是,每位小朋友应该怎样投票,才能使冲突数最小?
Input Format
文件的第一行只有两个整数 \(n,m\),保证有 \(2\le n\le 300,1\le m\le \frac{n(n-1)}{2}\)。其中 \(n\) 代表总人数,m代表好朋友的对数。文件第二行有 \(n\) 个整数,第 \(i\) 个整数代表第 \(i\) 个小朋友的意愿,当它为 \(1\) 时表示同意睡觉,当它为 \(0\) 时表示反对睡觉。接下来文件还有 \(m\) 行,每行有两个整数 \(i\) ,\(j\) 。表示 \(i\) ,\(j\) 是一对好朋友,我们保证任何两对 \(i\) ,\(j\) 不会重复。
Output Format
只需要输出一个整数,即可能的最小冲突数。
Sample
Input 1
3 3
1 0 0
1 2
1 3
3 2
Output 1
1
Range
\(2\le n\le 300, 1\le m\le n(n - 1) / 2\)
Algorithm
网络流
Mentality
先建立一个源点 \(S\) 和汇点 \(T\) ,然后将所有同意睡觉的人和 \(S\) 连边,否则和 \(T\) 连边,容量设为 \(1\) ,再将每对朋友之间连上一条容量为 \(1\) 的边。
若割去一条边的代价为 \(1\) ,不难发现题目所求其实际上就是使 \(S\) 与 \(T\) 之间不连通的最小代价,因为若 \(S\) 和 \(T\) 仍联通,说明它们之间仍有朋友的冲突没有被解决或是被计算。
若断去一个人与其朋友之间的边,就代表他没有违背自己的意愿,而若他断掉与自己所连的源、汇点之间的边,则代表他向朋友妥协了。
跟据最大流等于最小割,直接在建出的图上跑最大流即可。
Code
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
using namespace std;
#define LL long long
#define go(x, i, v) for (int i = hd[x], v = to[i]; i; v = to[i = nx[i]])
#define inline __inline__ __attribute__((always_inline))
inline LL read() {
LL x = 0, w = 1;
char ch = getchar();
while (!isdigit(ch)) {
if (ch == '-') w = -1;
ch = getchar();
}
while (isdigit(ch)) {
x = (x << 3) + (x << 1) + ch - '0';
ch = getchar();
}
return x * w;
}
const int Max_n = 305, Max_m = Max_n * Max_n << 1, inf = 1e9;
int n, m, S, T, ans;
int cntr = 1, hd[Max_n], cur[Max_n], nx[Max_m], to[Max_m], w[Max_m];
int dep[Max_n], fnow[Max_n], flow[Max_n];
void addr(int u, int v, int W) {
cntr++;
nx[cntr] = hd[u], to[cntr] = v, w[cntr] = W;
hd[u] = cntr;
}
queue<int> q;
bool build() {
for (int i = 1; i <= n + 2; i++) cur[i] = hd[i], dep[i] = -1, fnow[i] = 0;
q.push(S), dep[S] = 0, fnow[S] = 1e9;
while (!q.empty()) {
int x = q.front();
q.pop();
go(x, i, v) if (dep[v] == -1 && w[i]) dep[v] = dep[x] + 1, q.push(v);
}
return dep[T] != -1;
}
void dfs(int x) {
if (x == T) {
flow[x] = fnow[x], ans += flow[x];
return;
}
for (int i = cur[x], v = to[i]; i; v = to[i = nx[i]])
if (dep[v] == dep[x] + 1 && w[i]) {
cur[x] = i, fnow[v] = min(fnow[x], w[i]), dfs(v);
w[i] -= flow[v], fnow[x] -= flow[v];
w[i ^ 1] += flow[v], flow[x] += flow[v];
flow[v] = 0;
}
}
int main() {
#ifndef ONLINE_JUDGE
freopen("2057.in", "r", stdin);
freopen("2057.out", "w", stdout);
#endif
n = read(), m = read(), S = n + 1, T = n + 2;
for (int i = 1; i <= n; i++)
if (!read())
addr(S, i, 1), addr(i, S, 0);
else
addr(i, T, 1), addr(T, i, 0);
int u, v;
while (m--) {
u = read(), v = read();
addr(u, v, 1), addr(v, u, 0);
addr(u, v, 0), addr(v, u, 1);
}
while (build()) dfs(S);
cout << ans;
}
【SHOI 2007】善意的投票的更多相关文章
- [SHOI 2007] 善意的投票
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1934 [算法] 首先 , 选择睡觉的人和不选择睡觉的人构成两个集合 这启发我们用最小 ...
- [SHTSC 2007] 善意的投票
我就是来复习Dinic算法的,仅10天不写,我已经退化成写一遍+调试需要接近一个小时了,当然其中不乏在网上乱逛的时间… 赞成从S源点连一条单向边,反对向T汇点连一条单向边,朋友关系连双向边. 但是总感 ...
- 「SHOI2007」「Codevs2341」 善意的投票(最小割
2341 善意的投票 2007年省队选拔赛上海市队选拔赛 时间限制: 5 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 幼儿园里有n个小朋 ...
- C++之路进阶——bzoj1934(善意的投票)
F.A.Qs Home Discuss ProblemSet Status Ranklist Contest ModifyUser hyxzc Logout 捐赠本站 Notice:由于本OJ建立在 ...
- BZOJ-1934 Vote 善意的投票 最大流+建图
1934: [Shoi2007]Vote 善意的投票 Time Limit: 1 Sec Memory Limit: 64 MB Submit: 1551 Solved: 951 [Submit][S ...
- bzoj1934: [Shoi2007]Vote 善意的投票
最大流..建图方式都是玄学啊.. //Dinic是O(n2m)的. #include<cstdio> #include<cstring> #include<cctype& ...
- BZOJ 1934: [Shoi2007]Vote 善意的投票 最小割
1934: [Shoi2007]Vote 善意的投票 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnl ...
- 1934: [Shoi2007]Vote 善意的投票
1934: [Shoi2007]Vote 善意的投票 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 1174 Solved: 723[Submit][S ...
- 【BZOJ1934】善意的投票(网络流)
[BZOJ1934]善意的投票(网络流) 题面 Description 幼儿园里有n个小朋友打算通过投票来决定睡不睡午觉.对他们来说,这个问题并不是很重要,于是他们决定发扬谦让精神.虽然每个人都有自己 ...
- BZOJ_1934_[Shoi2007]Vote 善意的投票
BZOJ_1934_[Shoi2007]Vote 善意的投票 Description 幼儿园里有n个小朋友打算通过投票来决定睡不睡午觉.对他们来说,这个问题并不是很重要,于是他们决定发扬谦让精神.虽然 ...
随机推荐
- IDEA导入MySQL的jdbc驱动,并操作数据库
将MySQL的jdbc驱动,导入IDEA的方式,虽然也能连接并且操作数据库,但并不推荐这种方式,推荐使用Maven工程的方式:https://www.cnblogs.com/dadian/p/1193 ...
- Photoshop CS2软件下载与安装教程
Photoshop CS2精简版下载地址: 链接:https://pan.baidu.com/s/1ryJPLuKG_MixWjGJgLebOg提取码:nzz9 软件介绍: Photoshop主要处理 ...
- Sql server中用现有表中的数据创建Sql的Insert插入语句
之前,在Codeproject发表过一篇关于用现有表中数据创建Insert的Sql语句的存储过程,今天将其搬到这里来,注意本存储过程仅适用于SQL SERVER. 介绍 一些时候,你想导出一些现有表中 ...
- Mybatis日志体系
承接上一篇关于spring 5.x的日志体系,本篇看看Mybatis的日志体系及实现,Mybatis版本基于3.x. 关于mybatis的官方文档比较友好,分门别类,各有论述,如mybatis官方文档 ...
- Spring Security(二)--WebSecurityConfigurer配置以及filter顺序
“致"高级"工程师(BUG工程师) 一颗折腾的心
- HUB-交换机-路由器
HUB集线器-物理层 工作原理: 机器1发送一个数据(广播发送),经过集线器hub,hub会转发到其他所有机器,其他机器接收到数据,如果数据是给自己的就收下,如果不是自己的就丢弃 集线器的作用?(su ...
- 【HC资料合集】2019华为全联接大会主题资料一站式汇总,免费下载!
HUAWEI CONNECT 2019 大会主题演讲.峰会演讲精彩资料速递,欢迎下载查阅. 主题 资料下载(登录后可下载附件) 演讲者 [主题演讲资料]2019华为全联接大会day 2 共筑高品质 ...
- 基于webpack实现多html页面开发框架一 准备工作
本系列主要介绍如何基于webpack实现多html页面开发框架,这里不讲webpack的基本概念,废话不多说,直奔主题! 前置条件: 1.安装node环境,自己去官网下载安装 2.新建文件夹webpa ...
- Spring Boot 整合 Druid
Spring Boot 整合 Druid 概述 Druid 是阿里巴巴开源平台上的一个项目,整个项目由数据库连接池.插件框架和 SQL 解析器组成.该项目主要是为了扩展 JDBC 的一些限制,可以让程 ...
- luogu P1412 经营与开发 |dp
题目描述 4X概念体系,是指在PC战略游戏中一种相当普及和成熟的系统概念,得名自4个同样以"EX"为开头的英语单词. eXplore(探索) eXpand(拓张与发展) eXplo ...