poj 1611 並查集訓練


題意: 有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);

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com