標籤:並查集
做了一上午,終於ac了 wa了一次主要是忘了還有環!!!
主要是運用並查集知識,又複習了一次!!
思路:輸入之後找能不能成環,成環就不是,其次還要判斷是不是有兩個父節點,如果有兩個父節點也不是,之後就找相關的祖先就好了;
還要注意:如果只有一個節點,也是樹,如果有兩個或多個根節點也不是樹;如果沒有根節點也不是
連結http://acm.hdu.edu.cn/showproblem.php?pid=1325
代碼
#include<stdio.h>int fat[1000];int father( int n ) //尋找祖先{ if( fat[n] != n ) fat[n] = father(fat[n]); return fat[n];} int main(){ int i, j, n, m, a[1000], b[1000], v = 1; while( 1 ){ for( i = 0; i < 1000; i ++ ) fat[i] = i; int flag = 0; scanf( "%d%d", &a[0], &b[0] ); if( a[0]< 0&&b[0]< 0 ) break; fat[b[0]] = a[0];//由題意可知fat[b[i]] = a[i]; i = 1; while( scanf("%d%d", &a[i], &b[i]), a[i]||b[i] ){ if( flag == 0 ){ //如果flag=1那就表明成環了,或者有兩個父節點 if( fat[a[i]] == b[i] ){flag = 1; //判斷是不是成環continue;} if( fat[b[i]] != b[i] ) {flag = 1;//判斷是不是有兩個父節點 continue;} if( fat[a[i]]!= a[i] ) fat[a[i]] = father(a[i]); fat[b[i]] = a[i];}else{fat[b[i]] = a[i];}i++; } for( j = 0; j < i; ++ j ) //判斷有沒有祖先(根節點) if( fat[a[j]] == a[j] ) break;; if( i == j ) flag = 1; if( flag ){ printf( "Case %d is not a tree.\n", v++ ); continue; } else{ if( i == 1 ){ //如果只有一組 printf( "Case %d is a tree.\n", v++ ); continue; } for( j = 1; j < i; ++ j ) //判斷是不是有多個根節點 if( fat[a[j]] != fat[a[0]] ){ printf( "Case %d is not a tree.\n", v++ ); break; } if( j == i ) printf( "Case %d is a tree.\n", v++ ); } } return 0;}