幼兒園裡有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不會重複。
輸出格式:
只需要輸出乙個整數,即可能的最小衝突數。
比較套路的一道網路流題。。分為兩個集合,同意和不同意。劃分s集t集,會發生衝突的小夥伴們連雙向邊(因為是相對關係改變 所以是雙向邊)。最小割。。
#include
using
namespace
std;
const
int maxn=1e5+5;
const
int inf=1e9+7;
struct edgee[maxn<<1];
int head[maxn],cur[maxn],cnt=1;
inline
void add(int u,int v,int w),head[u]=cnt;
}int n,m,s,t;
queue
q;int dep[maxn];
bool bfs(int x)}}
if(!dep[t])return
0; return1;}
int dfs(int u,int flow)}}
return0;}
int dinic()
return ans;
}int main()
for(int i=1;i<=m;i++)
printf("%d",dinic());
return
0;}
luoguP2057善意的投票
題意大致就是有n個人有兩種不同的意見並且有許多朋友,需要讓朋友間盡可能的統一意見 少發生衝突 如果乙個人違反自己的本意也算衝突,求最少的衝突。明眼人直接發現是最小割,兩種意見可以看作源點s和t,我們需要做的是割最少的邊使得s和t成為兩個不同的集合,解釋 割掉的邊相當於1次衝突 因為若某邊被割走,則顯...
SHOI2007 善意的投票
這個題一開始看到資料範圍和只能選0或者1的時候,直接就想到了網路流.可是想到費用流上了。但是之後發現這個題並不能用費用流做。因為雖然代價可以轉化成費用,但是流量並不是可以確定限制的。先把圖轉化成二分圖 s連選0的,1連t。乙個人只能有兩種選擇,選了乙個另外乙個就不需要付出代價了 最小割。我們用流量表...
SHOI 2007 善意的投票
題目鏈結 演算法 首先 選擇睡覺的人和不選擇睡覺的人構成兩個集合 這啟發我們用最小割解決該問題 1.將源點與每個睡覺的人連邊 將每個不睡覺的人與匯點連邊 割掉這樣的一條邊的含義是 有乙個人放棄了睡覺 不睡覺 產生了1衝突 2.將朋友之間連邊 割掉這樣一條邊的含義是 這兩個人產生了衝突 求解這個圖的最...