7-25 朋友圈(25 分)(並查集的應用)
阿新 • • 發佈:2018-02-03
整數 () 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 分)(並查集的應用)