【转】POJ-1308-Is It A Tree?
连着三天做并查集了,一天一道,效率低呀···
并查集之后是最小生成树再之后是最短路径,回学校之前把图论基本算法过一遍吧。
回学校还要复习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;
}

浙公网安备 33010602011771号