description
某個地區有n(n<=1000)個犯罪團夥,當地**按照他們的危險程度由高到低給他們編號為1-n,他們有些團夥之間有直接聯絡,但是任意兩個團夥都可以通過直接或間接的方式聯絡,這樣這裡就形成了乙個龐大的犯罪集團,犯罪集團的危險程度唯一由集團內的犯罪團夥數量確定,而與單個犯罪團夥的危險程度無關(該犯罪集團的危險程度為n)。現在當地**希望花盡量少的時間(即打擊掉盡量少的團夥),使得龐大的犯罪集團分離成若干個較小的集團,並且他們中最大的乙個的危險程度不超過n/2。為達到最好的效果,他們將按順序打擊掉編號1到k的犯罪團夥,請程式設計求出k的最小值。
input
第一行乙個正整數n
接下來的n行每行有若干個正整數,第乙個整數表示該行除第乙個外還有多少個整數,若第i行存在正整數k,表示i,k兩個團夥可以直接聯絡
output
乙個正整數,為k的最小值
sample input
7
2 2 5
3 1 3 4
2 2 4
2 2 3
3 1 6 7
2 5 7
2 5 6
sample output
1
解題思路
按照正常思維:先把樹建好,再從最後乙個乙個刪
但是每次刪完都要重新維護,非常麻煩
(魯迅先生說過,要) 把思維逆轉過來
從最後乙個乙個加點i
ii,等同於刪掉了1i−
11~i-1
1i−1
個點注意
加點時一定要判斷,連線的加入點的點是不是比加入點大,因為要求的是刪掉前面的點,所以
樹中的點一定大於等於當前加入點
#include
#include
using namespace std;
int n,a[
1010][
1010
],rank[
1010
],fa[
1010];
int find
(int x)
void
into
(int x,int y)
}int main()
//儲存每個點之間的關係
for(int i=n;i>
0;i--
)//加入第i個點
for(int j=
1;j<=a[i][0
];j++)if
(a[i]
[j]>i)
}}
打擊犯罪 並查集
有n個人,相互之間有一些關係,從而形成乙個圖,現在要從1 n1 n 1 n 按順序去掉k個人 即去掉1 k1 k 1 k 使最大的子圖的點數 22,求k的最小值 某個地區有n n 1000 個犯罪團夥,當地 按照他們的危險程度由高到低給他們編號為1 n,他們有些團夥之間有直接聯絡,但是任意兩個團夥都...
並差集 打擊犯罪
某個地區有n n 1000 個犯罪團夥,當地 按照他們的危險程度由高到低給他們編號為1 n,他們有些團夥之間有直接聯絡,但是任意兩個團夥都可以通過直接或間接的方式聯絡,這樣這裡就形成了乙個龐大的犯罪集團,犯罪集團的危險程度唯一由集團內的犯罪團夥數量確定,而與單個犯罪團夥的危險程度無關 該犯罪集團的危...
並查集 打擊犯罪(ssl 2342)
有n個人某些人之間有連線 連線成乙個團夥 現在要最大的團夥人數不大於n 2,要最少要刪掉幾個人 要按順序刪 某個地區有n n 1000 個犯罪團夥,當地 按照他們的危險程度由高到低給他們編號為1 n,他們有些團夥之間有直接聯絡,但是任意兩個團夥都可以通過直接或間接的方式聯絡,這樣這裡就形成了乙個龐大...