這個題一開始看到資料範圍和只能選0或者1的時候,直接就想到了網路流......可是想到費用流上了。
但是之後發現這個題並不能用費用流做。因為雖然代價可以轉化成費用,但是流量並不是可以確定限制的。
先把圖轉化成二分圖——s連選0的,1連t。
乙個人只能有兩種選擇,選了乙個另外乙個就不需要付出代價了——最小割。
我們用流量表示代價,如果和自己的願望違背了,就是割掉一條流量為1的邊。
至於朋友的處理——只需要連線意願不一樣的朋友,中間需要連線1,表示如果朋友之間選擇的不一樣,每一對之間需要1的代價。
**如下:
#include#include#include#include#include#include#define s 0
#define t n+1
#define maxn 100010
#define inf 0x3f3f3f3f
using namespace std;
int n,m,t=1;
int op[maxn],head[maxn],dis[maxn],cur[maxn];
struct edgeedge[maxn<<1];
inline void add(int from,int to,int dis)
inline bool bfs()}}
if(dis[t]==0x3f3f3f3f) return false;
return true;
}inline int dfs(int x,int f)
}return used;
}inline int dinic()
int main()
for(int i=1;i<=m;i++)
printf("%d\n",dinic());
return 0;
}
SHOI 2007 善意的投票
題目鏈結 演算法 首先 選擇睡覺的人和不選擇睡覺的人構成兩個集合 這啟發我們用最小割解決該問題 1.將源點與每個睡覺的人連邊 將每個不睡覺的人與匯點連邊 割掉這樣的一條邊的含義是 有乙個人放棄了睡覺 不睡覺 產生了1衝突 2.將朋友之間連邊 割掉這樣一條邊的含義是 這兩個人產生了衝突 求解這個圖的最...
SHOI2007 善意的投票
嘟嘟嘟 看資料範圍,加上題中頻繁提到的衝突,就可以想到演算法是最小割。1.同意睡覺的,源點就像他連一條容量為1的邊。割掉它就代表他背叛了自己的意願。2.同理,不同意睡覺的,就像匯點連一條邊。3.考慮每一對朋友。如果兩個朋友意見相反,就互相連一條容量為1的邊,割掉其中的任意一條就代表朋友之間發生了衝突...
P2057 SHOI2007 善意的投票
題目描述 幼兒園裡有n個小朋友打算通過投票來決定睡不睡午覺。對他們來說,這個問題並不是很重要,於是他們決定發揚謙讓精神。雖然每個人都有自己的主見,但是為了照顧一下自己朋友的想法,他們也可以投和自己本來意願相反的票。我們定義一次投票的衝突數為好朋友之間發生衝突的總數加上和所有和自己本來意願發生衝突的人...