BZOJ 2768 冠軍調查

2022-05-13 11:21:21 字數 2084 閱讀 5675

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行...