標籤:
連著三天做並查集了,一天一道,效率低呀···
並查集之後是最小產生樹再之後是最短路徑,回學校之前把圖論基本演算法過一遍吧。
回學校還要複習DSA因為開學就是乙級PAT了。
當然英語和健身也不能落下。
這道題要考慮的地方有
①空樹
②無環
③非森林
④1 1 0 0 不是樹 不能自己指向自己
#include<iostream>#include<cstdio>#include<cstring>using namespace std;int M, N;const int Size=100;int Pre[Size+1];int Visit[Size+1];void Init(){ for(int i=1; i<Size+1; i++) Pre[i]=i; memset(Visit, 0, sizeof(Visit));}int GetPre(int a){ if(Pre[a]!=a) Pre[a]=GetPre(Pre[a]); return Pre[a];}bool Union( int a, int b ){ a=GetPre(a); b=GetPre(b); if(a==b) return false; Pre[a]=b; return true;}int main(){ int a, b; bool IsTree=true; int Case=1; while(scanf("%d%d",&a, &b))//每組資料的第一對 { if(a==-1) break; if( a==0&&b==0 ){// 空樹 printf("Case %d is a tree.\n", Case++); continue; } Init(); Visit[a]=Visit[b]=1; IsTree=true; if(a==b) IsTree=false; else Union(a, b); while(scanf("%d%d", &a, &b)) { if(a==0&&b==0) break; Visit[a]=Visit[b]=1; if(!Union(a,b)) IsTree=false; } int SetCnt=0; for( int i=1; i<Size+1; i++ ) if(Visit[i]&&Pre[i]==i) SetCnt++; if(SetCnt>1) IsTree=false; if(IsTree) printf("Case %d is a tree.\n", Case++); else printf("Case %d is not a tree.\n",Case++); } return 0;}
【轉】POJ-1308-Is It A Tree?