最重要的是要注意輸入輸出的格式。
1 #include <cstdio> 2 #include<iostream> 3 #define MAX 30 4 using namespace std; 5 6 int CharNum; 7 typedef struct node{ 8 int data_;//節點對應人的編號 9 int rank_;//節點對應的秩 10 int parent_;//節點對應雙親下標 11 }UFSTree; 12 void MAKE_SET(UFSTree t[]);//初始化並查集樹 13 int FIND_SET(UFSTree t[],int x);//在x所在子樹中查找集合編號 14 void UNION(UFSTree t[],int x,int y);//將x和y所在的子樹合併 15 int main() 16 { 17 18 //freopen("D:\\acm.txt","r",stdin); 19 int caseNum; 20 char MaxChar[20],pairChars[20]; 21 scanf("%d",&caseNum); 22 getchar();getchar(); 23 while(caseNum--){ 24 gets(MaxChar); 25 CharNum = MaxChar[0] - 'A' + 1;//字母的個數 26 int flag = 0;//子圖的個數 27 UFSTree t[MAX]; 28 MAKE_SET(t); 29 while(gets(pairChars)){ 30 int x,y; 31 if(pairChars[0] == 0)break; 32 x = pairChars[0] - 'A' + 1; 33 y = pairChars[1] - 'A' + 1; 34 if(FIND_SET(t,x)!= FIND_SET(t,y)){ 35 UNION(t,x,y); 36 } 37 } 38 for(int i = 1;i <= CharNum;i++){//統計子圖的個數 39 if(t[i].parent_ == i)flag++; 40 } 41 printf("%d\n",flag); 42 if(caseNum)printf("\n");//兩個輸出樣例之間有一空行,因爲這WA了好多次 43 } 44 return 0; 45 } 46 void MAKE_SET(UFSTree t[]){ 47 for(int i = 0;i <= CharNum;i++){//要從0開始,否則會RE,實際0不使用。 48 t[i].data_ = i;//數據爲該人編號 49 t[i].rank_ = 1; 50 t[i].parent_ = i;//父節點指向自己 51 } 52 } 53 int FIND_SET(UFSTree t[],int x){//找到祖宗節點 54 if(x != t[x].parent_){ 55 return (FIND_SET(t,t[x].parent_)); 56 } 57 else 58 return x; 59 } 60 void UNION(UFSTree t[],int x,int y){ 61 x = FIND_SET(t,x); 62 y = FIND_SET(t,y); 63 if(x == y)return; 64 if(t[x].rank_ > t[y].rank_){ 65 t[y].parent_ = x; 66 t[x].rank_ += t[y].rank_;//更新連接的個數 67 } 68 else{ 69 t[x].parent_ = y; 70 t[y].rank_ += t[x].rank_;//更新連接的個數 71 } 72 }