打擊犯罪 並查集

2021-09-24 05:08:14 字數 1396 閱讀 8657

有n個人,相互之間有一些關係,從而形成乙個圖,現在要從1……

n1……n

1……n

按順序去掉k個人(即去掉1……

k1……k

1……k

),使最大的子圖的點數

22,求k的最小值

某個地區有n(n<=1000)個犯罪團夥,當地**按照他們的危險程度由高到低給他們編號為1-n,他們有些團夥之間有直接聯絡,但是任意兩個團夥都可以通過直接或間接的方式聯絡,這樣這裡就形成了乙個龐大的犯罪集團,犯罪集團的危險程度唯一由集團內的犯罪團夥數量確定,而與單個犯罪團夥的危險程度無關(該犯罪集團的危險程度為n)。現在當地**希望花盡量少的時間(即打擊掉盡量少的團夥),使得龐大的犯罪集團分離成若干個較小的集團,並且他們中最大的乙個的危險程度不超過n/2。為達到最好的效果,他們將按順序打擊掉編號1到k的犯罪團夥,請程式設計求出k的最小值。

如下圖所示,打擊掉1號團夥便能達到目的。

第一行乙個正整數n。

接下來的n行每行有若干個正整數,第乙個整數表示該行除第乙個外還有多少個整數,若第i行存在正整數k,表示i,k兩個團夥可以直接聯絡。

乙個正整數,為k的最小值

7
2 2 5

3 1 3 4

2 2 4

2 2 3

3 1 6 7

2 5 7

2 5 6

1
因為要按順序,所以我們倒著用並查集加入每乙個點,然後看每乙個子圖是否符合,當全部符合時繼續,否則就輸出

#include

#include

#include

#define max(a,b) (a)>(b)?(a):(b)

#define min(a,b) (a)

using

namespace std;

int n,xx,yy,k,a[

1005][

1005

],dad[

1005

],b[

1005];

intfind

(int dep)

//並查集

voidlj(

int x,

int y)

intmain()

for(

int i=

1;i<=n;

++i)

dad[i]

=i;int i=n+1;

while

(!k)}}

printf

("%d"

,i);

}

並查集 打擊犯罪

description 某個地區有n n 1000 個犯罪團夥,當地 按照他們的危險程度由高到低給他們編號為1 n,他們有些團夥之間有直接聯絡,但是任意兩個團夥都可以通過直接或間接的方式聯絡,這樣這裡就形成了乙個龐大的犯罪集團,犯罪集團的危險程度唯一由集團內的犯罪團夥數量確定,而與單個犯罪團夥的危險...

並差集 打擊犯罪

某個地區有n n 1000 個犯罪團夥,當地 按照他們的危險程度由高到低給他們編號為1 n,他們有些團夥之間有直接聯絡,但是任意兩個團夥都可以通過直接或間接的方式聯絡,這樣這裡就形成了乙個龐大的犯罪集團,犯罪集團的危險程度唯一由集團內的犯罪團夥數量確定,而與單個犯罪團夥的危險程度無關 該犯罪集團的危...

並查集 打擊犯罪(ssl 2342)

有n個人某些人之間有連線 連線成乙個團夥 現在要最大的團夥人數不大於n 2,要最少要刪掉幾個人 要按順序刪 某個地區有n n 1000 個犯罪團夥,當地 按照他們的危險程度由高到低給他們編號為1 n,他們有些團夥之間有直接聯絡,但是任意兩個團夥都可以通過直接或間接的方式聯絡,這樣這裡就形成了乙個龐大...