link:
solution:
一道比較基礎的最大流的題目
一般看到將點分為兩類的題目就要往網路流方向想吧
建圖:源點向每個初始立場為1的人連權值為1的邊。
每個初始立場為0的人向匯點連權值為1的邊。
好朋友之間互相連權值為1的邊。
最小割即是答案。
要滿足要求且總和最小,就不能讓任何一對(1,0)關係成立,這便對應著最小割模型
割與源/匯點的邊對應「說謊」,割二分圖內部的邊對應「立場不同」
code:
//by newera
#include using
namespace
std;
#define ff first
#define ss second
#define pb push_back
#define mp make_pair
#define bged(v) (v).begin(),(v).end()
#define foreach(it,s) for(__typeof((s).begin()) it=(s).begin();it!=(s).end();it++)typedef
long
long
ll;typedef pair
p;typedef pair
int,int>,int>pp;
const
int inf=1
<<27
;const
int mod=1e9+7;//
my io system
struct
fastio
inline
char
get()
bool
notend()
}_buff;
#define read1(x) x=getnum()
#define read2(x,y) read1(x),read1(y)
#define read3(x,y,z) read2(x,y),read1(z)
#define write1(x) putnum(x),putchar('\n')
#define write2(x,y) write1(x),write1(y)
#define write3(x,y,z) write2(x,y),write1(z)inline ll getnum()
template
inline void
putnum(t x)
,sz=0
;
while(x)a[sz++]=x%10,x/=10
;
if(sz==0)putchar('0'
);
for(int i=sz-1;i>=0;i--)putchar('
0'+a[i]);
}const
int maxn=500
;int
n,m,s,t,level[maxn],iter[maxn],dat[maxn];
struct
edge
;vector
a[maxn];
void add_edge(int to,int
from,int
cap)
); a[
from].push_back(edge);
}void
bfs()}}
}int dfs(int v,int
f) }
return
ret;
}int
main()
for(int i=1;i<=m;i++)
ll res=0
;
while(true
)
cout
}
review:
很多時候碰到這樣類似的二元關係就要往網路流方向想
割的邊容量即為計入答案的數值
BZOJ 2768 冠軍調查(最小割)
題意 給出乙個無向圖,每個點有乙個值0或者1。現在重新設定每個點的值0或者1。設重新設定後的點與原來的點有x個點的值不一樣 重新設定後有y條邊 u,v 使得u和v的值不同。最小化x y。思路 若初始值為1則原點向其連邊 否則其向匯點連邊。對於邊 u,v u和v的值不同,則連邊。求最小割。若左側被割到...
BZOJ 2768 冠軍調查 最小割
time limit 10 sec memory limit 128 mb submit 971 solved 661 submit status discuss 第一行兩個整數n和m,其中n 2 n 300 表示參與者的總數,m 0 m n n 1 2 表示朋友的總對數。第二行n個整數,要麼是0要...
bzoj2768 網路流 最小割 冠軍調查
description input 第一行兩個整數n和m,其中n 2 n 300 表示參與者的總數,m 0 m n n 1 2 表示朋友的總對數。第二行n個整數,要麼是0要麼是1。如果第i個整數的值是0的話,表示第i個人心裡認為切爾西將與冠軍無緣,如果是1的話,表示他心裡認為切爾西必將奪魁。下面m行...