codevs 5971 打擊犯罪

2022-08-09 10:36:13 字數 1219 閱讀 7757

某個地區有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,他們有些團夥之間有直接聯絡,但是任意兩個團夥都可以通過直接或者間接的方式聯絡,這樣這裡就形成了乙個龐大的犯罪集團,犯罪集團的危險...