某個地區有n(n<=1000)個犯罪團夥,當地**按照他們的危險程度由高到低給他們編號為1-n,他們有些團夥之間有直接聯絡,但是任意兩個團夥都可以通過直接或間接的方式聯絡,這樣這裡就形成了乙個龐大的犯罪集團,犯罪集團的危險程度唯一由集團內的犯罪團夥數量確定,而與單個犯罪團夥的危險程度無關(該犯罪集團的危險程度為n)。現在當地**希望花盡量少的時間(即打擊掉盡量少的團夥),使得龐大的犯罪集團分離成若干個較小的集團,並且他們中最大的乙個的危險程度不超過n/2。為達到最好的效果,他們將按順序打擊掉編號1到k的犯罪團夥,請程式設計求出k的最小值。
第一行乙個正整數n。接下來的n行每行有若干個正整數,第乙個整數表示該行除第乙個外還有多少個整數,若第i行存在正整數k,表示i,k兩個團夥可以直接聯絡。
乙個正整數,為k的最小值
輸出1(打擊掉紅色團夥)
這題的題意就是正向順序刪點1~k,使得每個集合的個數都不超過(n + 1) / 2,問最小的k是多少?
正向順序刪點?感覺跟之前的 hdu 4496 d-city 有點相像;
如果正向順序刪點的話,那麼每一次都需要重新維護並查集,所以我們可以逆向考慮,即從n~1開始列舉,將點加入圖中,此時意味著刪除了1 ~ k - 1,圖還剩k ~ n;
若此時剩下每個集合的個數還不超過(n + 1)/ 2,則繼續逆向列舉,則到超過為止;
1 #include2打擊犯罪using
namespace
std;
3const
int n = 1010;4
intf[n], a[n][n], sum[n], n;
5void
init()10}
11int getf(int
x)15
intmain()23}
24for(int i = n; i >= 1; i--)35}
36}37}
38}39return0;
40 }
codevs5971 打擊犯罪
題目描述 description 某個地區有n n 1000 個犯罪團夥,當地 按照他們的危險程度由高到低給他們編號為1 n,他們有些團夥之間有直接聯絡,但是任意兩個團夥都可以通過直接或間接的方式聯絡,這樣這裡就形成了乙個龐大的犯罪集團,犯罪集團的危險程度唯一由集團內的犯罪團夥數量確定,而與單個犯罪...
codevs 5971 打擊犯罪 x
題目描述 description 某個地區有n n 1000 個犯罪團夥,當地 按照他們的危險程度由高到低給他們編號為1 n,他們有些團夥之間有直接聯絡,但是任意兩個團夥都可以通過直接或間接的方式聯絡,這樣這裡就形成了乙個龐大的犯罪集團,犯罪集團的危險程度唯一由集團內的犯罪團夥數量確定,而與單個犯罪...
9011 打擊犯罪
time limit 1 second memory limit 128 mb 某個地區有n n 1000 個犯罪團夥,當地 按照他們的危險程度由高到低給他們編號為1 n,他們有些團夥之間有直接聯絡,但是任意兩個團夥都可以通過直接或者間接的方式聯絡,這樣這裡就形成了乙個龐大的犯罪集團,犯罪集團的危險...