P2057 SHOI2007 善意的投票

2021-10-02 09:21:00 字數 1100 閱讀 8080

題目描述

幼兒園裡有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 31 0 0

1 21 3

3 2輸出 #1

1說明/提示

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

源點s表示支援睡覺,匯點s表示不睡覺。s點連向支援睡覺的小朋友一條流量為1的邊,不支援睡覺的小朋友連向t點一條流量為1的邊。互為好友關係的小朋友直接連有流量為1的雙向邊。

求得最小割,將小朋友劃分到兩個不同的集合。最小割的代價就是最小衝突數

#includeusing namespace std;

struct nodeedge[120000];

int head[500],tot = 1,s,t,dis[500];

inline void add(int u,int v,int w)

bool bfs()}}

return dis[t] != -1;

}int dfs(int u,int exp)

}return flow;

}int dinic()

return ans;

}int main()

for (int i = 1,u,v;i<=m;i++)

printf("%d",dinic());

return 0;

}

題解 P2057 SHOI2007 善意的投票

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

洛谷P2057 SHOI2007 善意的投票

題目鏈結 這道題是最小割的乙個經典應用 劃分集合。題目的意思就是就是將所有的小朋友分為兩個集合 同意睡覺和不同意睡覺的。不同的集合之間的邊都要斷開。我們設 s 為投票結果為不想睡覺的小朋友 顏色為0 的集合 t 為投票結果為想睡覺的小朋友 顏色為1 的集合。然後對於乙個小朋友 i 設他的 顏色 為x...

SHOI2007 善意的投票

這個題一開始看到資料範圍和只能選0或者1的時候,直接就想到了網路流.可是想到費用流上了。但是之後發現這個題並不能用費用流做。因為雖然代價可以轉化成費用,但是流量並不是可以確定限制的。先把圖轉化成二分圖 s連選0的,1連t。乙個人只能有兩種選擇,選了乙個另外乙個就不需要付出代價了 最小割。我們用流量表...