[題目鏈結]
[演算法]
首先 , 選擇睡覺的人和不選擇睡覺的人構成兩個集合
這啟發我們用最小割解決該問題 :
1. 將源點與每個睡覺的人連邊 , 將每個不睡覺的人與匯點連邊 , 割掉這樣的一條邊的含義是 : 有乙個人放棄了睡覺 / 不睡覺 , 產生了1衝突
2. 將朋友之間連邊 , 割掉這樣一條邊的含義是 : 這兩個人產生了衝突
求解這個圖的最小割即可
時間複雜度 : o(dinic(n , m))
[**]
#includeusingnamespace
std;
#define n 310typedef
long
long
ll;typedef
long
double
ld;typedef unsigned
long
long
ull;
const
int inf =1e9;
struct
edge
e[n * n * 4
];int
tot , n , m , s , t;
inthead[n] , dep[n];
template
inline void chkmin(t &x , t y)
template
inline void chkmax(t &x , t y)
template
inline void read(t &x)
inline
void addedge(int u , int v , intw);
head[u] =tot;
++tot;
e[tot] = (edge);
head[v] =tot;
}inline
bool bfs(int
s) }
}return
false;}
inline
int dinic(int u , int
flow)
}return flow -rest;}
intmain()
for (int i = 1; i <= m; i++)
int ans = 0
;
while
(bfs(s))
printf(
"%d\n
", ans);
return0;
}
SHOI2007 善意的投票
這個題一開始看到資料範圍和只能選0或者1的時候,直接就想到了網路流.可是想到費用流上了。但是之後發現這個題並不能用費用流做。因為雖然代價可以轉化成費用,但是流量並不是可以確定限制的。先把圖轉化成二分圖 s連選0的,1連t。乙個人只能有兩種選擇,選了乙個另外乙個就不需要付出代價了 最小割。我們用流量表...
SHOI2007 善意的投票
嘟嘟嘟 看資料範圍,加上題中頻繁提到的衝突,就可以想到演算法是最小割。1.同意睡覺的,源點就像他連一條容量為1的邊。割掉它就代表他背叛了自己的意願。2.同理,不同意睡覺的,就像匯點連一條邊。3.考慮每一對朋友。如果兩個朋友意見相反,就互相連一條容量為1的邊,割掉其中的任意一條就代表朋友之間發生了衝突...
P2057 SHOI2007 善意的投票
題目描述 幼兒園裡有n個小朋友打算通過投票來決定睡不睡午覺。對他們來說,這個問題並不是很重要,於是他們決定發揚謙讓精神。雖然每個人都有自己的主見,但是為了照顧一下自己朋友的想法,他們也可以投和自己本來意願相反的票。我們定義一次投票的衝突數為好朋友之間發生衝突的總數加上和所有和自己本來意願發生衝突的人...