最小割1 善意的投票

2022-07-16 22:39:19 字數 2268 閱讀 3007

幼兒園裡有n個小朋友打算通過投票來決定睡不睡午覺。對他們來說,這個問題並不是很重要,於是他們決定發揚謙讓精神。雖然每個人都有自己的主見,但是為了照顧一下自己朋友的想法,他們也可以投和自己本來意願相反的票。我們定義一次投票的衝突數為好朋友之間發生衝突的總數加上和所有和自己本來意願發生衝突的人數。

我們的問題就是,每位小朋友應該怎樣投票,才能使衝突數最小?

輸入格式:

檔案的第一行只有兩個整數n,m,保證有2≤n≤300,1≤m≤n(n-1)/2。其中n代表總人數,m代表好朋友的對數。檔案第二行有n個整數,第i個整數代表第i個小朋友的意願,當它為1時表示同意睡覺,當它為0時表示反對睡覺。接下來檔案還有m行,每行有兩個整數i,j。表示i,j是一對好朋友,我們保證任何兩對i,j不會重複。

輸出格式:

只需要輸出乙個整數,即可能的最小衝突數。

輸入樣例#1:複製

3 3

1 0 0

1 21 3

3 2

輸出樣例#1:複製

1

2≤n≤300,1≤m≤n(n-1)/2。

題解:要麼投睡覺要麼不睡,所以應分成兩個集合,因為可以跟著好朋友改意見,所以可以連著邊的人都可以投同乙個票。每個人只有兩種選擇,所以肯定和s點或t點連著,所以如果割變是與源匯點連著,則算是與自己的意願衝突,如果割在朋友間則是與朋友的衝突。每割斷一對好友或自身意願。衝突數加一,所以就是求最小割。最小割等於最大流。 

注意的是一對好友之間可以互相改意見,所以直接建雙向邊(注意是雙向邊,和原來演算法的反向邊區分好,這是本題需要,反向邊是為了保證演算法正確,都要建,剛開始我就被坑了)。自己再建乙個s點表示一種最初觀點相同的人,建乙個t點表示另一種。我是投1的連s,投0的人連t。 

**:

#include#include

#include

#include

#include

#include

#include

#include

#define maxn 200005typedef

long

long

ll;#define inf 1000000009

intx,y,num;

using

namespace

std;

struct

edge;

vector

mp[maxn]; //

鄰接圖bool

vis[maxn];

void add_edge(int

from,int to,int cap) //

建圖);

mp[to].push_back((edge)); //

反向弧}

int dfs(int v,int t,int f) //

找增廣路 v,t是最終點 用了f的流量}}

return0;

}int max_flow(int s,intt)}

intmain()

for(int i=0;i)

int ans=max_flow(305,306

); cout

return0;

}

dina**:

"

font-size:12px;

">#include #include

#include

using

namespace

std;

intconst inf = 0x3f3f3f3f

;int

const max = 205

;int

n, m;

int c[max][max], dep[max];//

dep[max]代表當前層數

int bfs(int s, int t)//

重新建圖,按層次建圖}}

return dep[t] != -1;}

int dfs(int u, int mi, int t)//

查詢路徑上的最小流量

}return0;

} intdinic()

}return

ans;}

intmain()

printf(

"%d\n

", dinic());

}return0;

}

BZOJ 1934 善意的投票 最小割

time limit 1 sec memory limit 64 mb submit 2354 solved 1471 submit status discuss 幼兒園裡有n個小朋友打算通過投票來決定睡不睡午覺。對他們來說,這個問題並不是很重要,於是他們決定發揚謙讓精神。雖然每個人都有自己的主見,...

善意的投票

幼兒園裡有n個小朋友打算通過投票來決定睡不睡午覺。對他們來說,這個問題並不是很重要,於是他們決定發揚謙讓精神。雖然每個人都有自己的主見,但是為了照顧一下自己朋友的想法,他們也可以投和自己本來意願相反的票。我們定義一次投票的衝突數為好朋友之間發生衝突的總數加上和所有和自己本來意願發生衝突的人數。我們的...

洛谷 P2057 善意的投票(網路流最小割)

幼兒園裡有n個小朋友打算通過投票來決定睡不睡午覺。對他們來說,這個問題並不是很重要,於是他們決定發揚謙讓精神。雖然每個人都有自己的主見,但是為了照顧一下自己朋友的想法,他們也可以投和自己本來意願相反的票。我們定義一次投票的衝突數為好朋友之間發生衝突的總數加上和所有和自己本來意願發生衝突的人數。我們的...