1. 程式人生 > >7-25 朋友圈(25 分)(並查集的應用)

7-25 朋友圈(25 分)(並查集的應用)

整數 () lib 負數 朋友圈 是我 ng- 輸入格式 並查集

某學校有N個學生,形成M個俱樂部。每個俱樂部裏的學生有著一定相似的興趣愛好,形成一個朋友圈。一個學生可以同時屬於若幹個不同的俱樂部。根據“我的朋友的朋友也是我的朋友”這個推論可以得出,如果A和B是朋友,且B和C是朋友,則A和C也是朋友。請編寫程序計算最大朋友圈中有多少人。

輸入格式:

輸入的第一行包含兩個正整數N(≤30000)和M(≤1000),分別代表學校的學生總數和俱樂部的個數。後面的M行每行按以下格式給出1個俱樂部的信息,其中學生從1~N編號:

第i個俱樂部的人數Mi(空格)學生1(空格)學生2 … 學生Mi

輸出格式:

輸出給出一個整數,表示在最大朋友圈中有多少人。

輸入樣例:

7 4
3 1 2 3
2 1 4
3 5 6 7
1 6

輸出樣例:

4
 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<string.h>
 4 
 5 void Union( int x,int y);
 6 int Find( int x);
 7 
 8 int n,m;
 9 int bcj[30005];
10 
11 int main()
12 {
13     int i;
14     int n1;
15     int x,y;
16     int ans = 0;
17     scanf("%d %d",&n,&m);
18 for( i=1; i<=n; i++) bcj[i] = -1; //初始化並查集 19 20 while( m-- ) 21 { 22 scanf("%d",&n1); 23 for( i=1; i<=n1; i++) 24 { 25 if( i==1 ) 26 { 27 scanf("%d",&x); 28 } 29 else 30 {
31 scanf("%d",&y); 32 Union(x,y); 33 } 34 } 35 } 36 for( i=1; i<=n; i++) 37 { 38 if( bcj[i]<ans ) ans = bcj[i]; //負數需尋找最小的值 39 } 40 ans = 0-ans; //用負數表示集合中元素的個數 41 printf("%d",ans); 42 return 0; 43 } 44 45 //以下是並查集的兩個基本操作 46 int Find( int x) 47 { 48 if(bcj[x]<0) return x; 49 return bcj[x] = Find(bcj[x]); 50 } 51 52 void Union( int x, int y) 53 { 54 x = Find(x); 55 y = Find(y); 56 57 if( x==y ) return; 58 bcj[x] += bcj[y]; 59 bcj[y] = x; 60 }




7-25 朋友圈(25 分)(並查集的應用)