判定给定的边序列是否过程一棵树。我用到的判定方法是:第一步:判定  边数是否等于顶点数-1  第二:判定是否只有一个根节点  。当然还要考虑是否为空树的情况。

  但是代码交上去,好几遍都是Runtime Error。。。看了一下discuss,并没有觉得自己的程序有错误。但是别人类似的代码却能过掉。。。说明自己的代码写的还是有很大的不足啊。。。

先附上自己的代码,是在不知道有什么错误。看discuss,好像有的代码数组只开到20就a掉了。

#include"iostream"
#include"stdio.h"
#include"algorithm"
#include"string"
#include"string.h"
#include"cmath"
#include"queue"
#include"stack"
#include"vector"
#include"ctype.h"
using namespace std;
const int mx=100005;
int fa[mx];
bool visited[mx];
bool flag1,flag2;
int src,dest,edgenum,vernum,icase=1;

void Set()
{
    for(int i=0;i<mx;i++)
        fa[i]=i;
}

int Find(int x)
{
    while(x!=fa[x]) x=fa[x];
    return fa[x];
}

void Union()
{
    int fsrc=Find(src);
    int fdest=Find(dest);
    fa[fdest]=fsrc;
}
void Init()
{
   Set();
   memset(visited,false,sizeof(visited));
   edgenum=0;
   vernum=0;
   flag1=flag2=false;
}
bool judge()//判断是否只有一个根节点
{
    int i,j;
    for(i=0;i<mx;i++)
        if(visited[i]) break;
    int temp=Find(i);
    for(j=i;j<mx;j++)
        if(visited[j]&&Find(j)!=temp) return true;
    return false;
}

int main()
{
  //  freopen("E:\\in.txt","r",stdin);
    Init();Set();
    while(scanf("%d%d",&src,&dest))
    {
        if(src==-1||dest==-1) break;
        if(src==0&&dest==0)
        {
            if(edgenum==0){printf("Case %d is a tree.\n",icase++);Init();continue;}
            if(edgenum!=vernum-1) flag1=true;
            if(judge()) flag2=true;
            if(flag1||flag2)
                printf("Case %d is not a tree.\n",icase++);
            else
                printf("Case %d is a tree.\n",icase++);
            Init();Set();
            continue;
        }
        edgenum++;
        if(!visited[src]) {visited[src]=true;vernum++;}
        if(!visited[dest]) {visited[dest]=true;vernum++;}
        Union();
    }
    return 0;
}
View Code

相关文章: