本文主要是介绍poj 1308 图论,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
给的不是连续的数字时用标记的方法来做;
#include"stdio.h"
#include"string.h"
int pre[1000005];
int mark[1000005],flag;
int find(int k)
{
if(k!=pre[k])
pre[k]=find(pre[k]);
return pre[k];
}
void fun(int a,int b)
{
mark[a]=a;
mark[b]=b;
a=find(a);
b=find(b);
if(a!=b)
pre[b]=a;
else
flag=1;
}
int main()
{
int m,n,i,sum,k=1;
while(scanf("%d%d",&m,&n),m!=-1&&n!=-1)
{
if(m==0&&n==0)
{
printf("Case %d is a tree.\n",k++);
continue;
}
flag=0;sum=0;
memset(mark,0,sizeof(mark));
for(i=0;i<=1000000;i++)
pre[i]=i;
fun(m,n);
while(scanf("%d%d",&m,&n),m||n)
{
fun(m,n);
}
for(i=1;i<=100000;i++)
{
if(mark[i]!=0)
{
if(pre[i]==i)
sum++;
}
}
if(sum==1&&flag==0)
printf("Case %d is a tree.\n",k++);
else
printf("Case %d is not a tree.\n",k++);
}
return 0;
}
这篇关于poj 1308 图论的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!