HDOJ1272--小希的迷宫 http://acm.hdu.edu.cn/showproblem.php?pid=1272 #include <stdio.h> #define MAXNUM 100 #define TRUE 1 #define FALSE 0 void link(int x,int root[]); void main(){ int refer[MAXNUM+1]={0}; //顶点参考数组,以确定某顶点是否已经出现过 int vexs[MAXNUM]={0}; //顶点数组 int root[MAXNUM]; //各不相交树的最远祖先 int ivex,jvex,vexnum=0,edgenum=0; int father; int finished=FALSE,connected=TRUE; int i; for(i=0;i<MAXNUM;i++) root[i]=i; //初始化,每个顶点都属于一个集合 while(scanf("%d%d",&ivex,&jvex)){ if(ivex==-1&&jvex==-1) break; if(ivex==0&&jvex==0) finished=TRUE; if(finished){ //已完成输入,判断是否符合题意 finished=FALSE; link(vexs[0],root); //使与vexs[0]同属于一个集合的元素以统一的标志出现,即是下面的father father=root[vexs[0]]; //若该图联通,则所有的顶点即位于同一个集合内,即是,他们的标志都一样,为father for(i=0;i<vexnum;i++){ //对个顶点进行判断 link(vexs[i],root); if(root[vexs[i]]!=father) {connected=FALSE;break;} }//for if(!connected) { printf("NO!--Because the rooms don't connect each other/n"); connected=TRUE; }//if else if(vexnum!=(edgenum+1)) printf("NO!--Because there are cycles!/n"); else printf("YES!/n"); for(i=0;i<MAXNUM;i++){ root[i]=i; vexs[i]=0; refer[i]=0; }//for-再次初始化,下次使用 refer[MAXNUM]=0; vexnum=edgenum=0; }//if(finished) else{ //继续输入数据 if(refer[ivex]==0){ //还未输入过ivex refer[ivex]=1; vexs[vexnum++]=ivex; } if(refer[jvex]==0){ refer[jvex]=1; vexs[vexnum++]=jvex; }//if edgenum++; link(ivex,root); link(jvex,root); root[root[ivex]]=root[jvex]; //ivex的祖先是jvex }//else }//while }//main void link(int x,int root[]){ //将x的所在集合,即x的最远祖先的所有子孙以统一标识标注。其所有子孙i的root[i]皆为该祖先y //意味:他们皆属于以y为根的树 int father,temp; father=x; while(father!=root[father]) father=root[father]; while(x!=father){ temp=root[x]; root[x]=father; x=temp; }//WHILE }//link 开始没有想到使用并查集判断图是否连通…… 太马虎,在重新赋值处未考虑周详导致程序运行错误……