判定给定的边序列是否过程一棵树。我用到的判定方法是:第一步:判定 边数是否等于顶点数-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; }