原题传送门 我们一眼就能看出这是一道最小割的题 我们设不睡觉这种状态为S,睡觉这种状态为T 对于每个人,如果不想睡觉,就从S向这个人连流量为1的边,否则,就从这个人向T连流量为1的边 对于每一对朋友,互相连流量为1的边 最后答案就是这个图的最小割,即最大流(自己画图想一想) 随便写个ISAP就行了 #include <bits/stdc++.h> #define N 305 #define M 90005 #define inf (1<<30) #define getchar nc…
题目链接 \(Click\) \(Here\) 考虑模型转换.变成文理分科二选一带收益模型,就一波带走了. 如果没有见过这个模型的话,这里讲的很详细. #include <bits/stdc++.h> using namespace std; #define LL long long const int N = 400010; const int M = 800010; const int INF = 0x3f3f3f3f; const LL INFF = 0x3f3f3f3f3f3f3f3f…
P2057 [SHOI2007]善意的投票 题目描述 幼儿园里有n个小朋友打算通过投票来决定睡不睡午觉.对他们来说,这个问题并不是很重要,于是他们决定发扬谦让精神.虽然每个人都有自己的主见,但是为了照顾一下自己朋友的想法,他们也可以投和自己本来意愿相反的票.我们定义一次投票的冲突数为好朋友之间发生冲突的总数加上和所有和自己本来意愿发生冲突的人数. 我们的问题就是,每位小朋友应该怎样投票,才能使冲突数最小? 输入输出格式 输入格式: 文件的第一行只有两个整数n,m,保证有2≤n≤300,1≤m≤n…
题目 P2057 [SHOI2007]善意的投票 解析 网络流的建模都如此巧妙. 我们把同意的意见看做源点\(s\),不同意的意见看做汇点\(t\). 那我们\(s\)连向所有同意的人,\(t\)连向所有反对的人,流量为1,表示了与其原方案直接冲突的代价,好友之间连双向边(双向边使因为可以从同意变为不同意,也可以从不同意变为同意),流量为1,表示改变意见要付出的代价,因为这个人改变意见后,原来与其意见冲突的朋友与他意见就不冲突了,所以代价为1. 我们要让所有人意见统一,就是让源点和汇点之间没有不…
P2057 [SHOI2007]善意的投票 / [JLOI2010]冠军调查 拿来练网络流的qwq 思路:如果i不同意,连边(i,t,1),否则连边(s,i,1).好朋友x,y间连边(x,y,1)(y,x,1),最小割即为答案.每割一条边表示与他的意愿不相符. #include<bits/stdc++.h> using namespace std; const int N=305; const int inf=1000000007; int head[N],num_edge=1; struct…
题目链接: https://www.luogu.org/problemnew/show/P2057 分析: 由0和1的选择我们直觉的想到0与S一堆,1与T一堆. 但是发现,刚开始的主意并不一定是最终的结果. 于是用源点S表示最终选择0的集合. 汇点T表示最终选择1的集合. 如果一个人P选择了0,那么S−>PS->PS−>P连一条流量为1的边,然后P−>TP->TP−>T连一条流量为0的边. 反之如果P选择了1,那么S−>PS->PS−>P连一条流量为0…
$ \color{#0066ff}{ 题目描述 }$ 幼儿园里有n个小朋友打算通过投票来决定睡不睡午觉.对他们来说,这个问题并不是很重要,于是他们决定发扬谦让精神.虽然每个人都有自己的主见,但是为了照顾一下自己朋友的想法,他们也可以投和自己本来意愿相反的票.我们定义一次投票的冲突数为好朋友之间发生冲突的总数加上和所有和自己本来意愿发生冲突的人数. 我们的问题就是,每位小朋友应该怎样投票,才能使冲突数最小? \(\color{#0066ff}{输入格式}\) 文件的第一行只有两个整数n,m,保证有…
题目大意:有$n(n\leqslant300)$个人,每个人可以选择$0$或$1$,每个人最开始有意愿,有$m(m\leqslant\dfrac{n(n-1)}2)$对好朋友.定义一次的冲突数为好朋友之间发生冲突的总数加上和自己本来意愿发生冲突的人数. 题解:最小割,源点向原意愿为$0$的点连边,原意愿为$1$的向汇点连边,好朋友之间连边.但如果转换为最大流,好朋友之间要连双向边(不然一个人换选择了就会挂,其实想想,连单向边的话谁连谁?) 卡点:无 C++ Code: #include <alg…
思路 简单的最小割模型 最小割的模型就是选出一些边,把点集划分成S和T两个部分,使得代价最小 到这题上就是板子了 代码 #include <cstdio> #include <algorithm> #include <cstring> #include <vector> #include <queue> using namespace std; const int MAXN = 1000; const int INF = 0x3f3f3f3; i…
正解:网络流 解题报告: 传送门! $umm$看到每个人要么0要么1就考虑最小割呗,,,? 然后贡献有两种?一种是违背自己的意愿,一种是和朋友的意愿违背了 所以考虑开一排点分别表示每个人,然后$S$表示0$T$表示1每个人先分别连向自己的意愿 然后再每个人向朋友连边 然后就欧克了,,,? #include<bits/stdc++.h> using namespace std; #define il inline #define gc getchar() #define ri register…