本文转载自
zengchenacmer
查看原文
2013-12-14
479
并查集训练
題意: 有n個學生 , 學校中有m個社團 , 如果一個社團中的某個人是嫌疑人 , 那么這個社團中的所有人都是嫌疑人 , 題目給定學生 0 是嫌疑人 , 求總共有多少嫌疑人?
這是一個比較簡單的並查集 , 通過判斷其他學生的根節點和0這個學生的根節點是不是一樣 。
但這個題目優化 , 和沒有優化的時間消耗差別很大 , 下面是兩種不同優化的代碼和時間復雜度
代碼一:只有了路徑壓縮優化
#include
#include
#include
using namespace std;
int n , m;
int p[30010] ;
int find(int x)
{
int h = x , g;
while(p[x] != x)
x = p[x];
while(p[h] != x)
{
g = p[h];
p[h] = x;
h = g;
}
return x;
}
int main()
{
while(scanf("%d %d" , &n , &m) != EOF)
{
if(n == 0 && m == 0) break;
int i , j , k;
for(i = 0; i < n; i++)
p[i] = i;
int x , y , h , g;
for(i = 0; i < m; i++)
{
scanf("%d" , &k);
if(k != 0)
{
scanf("%d" , &x);
g = find(x);
for(j = 2; j <= k; j++)
{
scanf("%d" , &y);
h = find(y);
p[h] = g;
}
}
}
int sum = 1;
g = find(0);