标签:
连着三天做并查集了,一天一道,效率低呀···
并查集之后是最小生成树再之后是最短路径,回学校之前把图论基本算法过一遍吧。
回学校还要复习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; }
标签:
原文地址:http://www.cnblogs.com/FightForCMU/p/4706016.html