【请教】acm--基于并查集
请教HDOJ acm小希的迷宫:Problem: http://acm.hdu.edu.cn/showproblem.php?pid=1272
怎么都有问题,VC编译通过,但是运行结果不正确,自己检查不出来了……不知道是哪里的问题……还望高手指点。谢谢先~
代码如下:代码中使用了并查集来判断图是否连通。为了算法清晰,特地添加了一些注释
运行的问题是:当第一组输入是不连通或者有环的时候,即printf(NO);时,其余输入都会是不连通,提示是:don't connect;如果第一次的输入是连通的且无环,即符合题意时,会正常的printf(YES);也就是说,只要出现不符合题意的输入,则以后的输入都会是不符合题意的(尽管他们其实是符合题意的……)
真不知为什么……connected是正常初始化且在变成FALSE后再次被赋予TRUE的啊……
另,为什么MAXNUM不能是超过100000的数?int的取值范围是大于100000的啊?WHY?
怎么都有问题,VC编译通过,但是运行结果不正确,自己检查不出来了……不知道是哪里的问题……还望高手指点。谢谢先~
代码如下:代码中使用了并查集来判断图是否连通。为了算法清晰,特地添加了一些注释
#include <stdio.h>
#define MAXNUM 10000
#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=root[vexs[0]]; //若该图联通,则所有的顶点即位于同一个集合内
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;
}//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
运行的问题是:当第一组输入是不连通或者有环的时候,即printf(NO);时,其余输入都会是不连通,提示是:don't connect;如果第一次的输入是连通的且无环,即符合题意时,会正常的printf(YES);也就是说,只要出现不符合题意的输入,则以后的输入都会是不符合题意的(尽管他们其实是符合题意的……)
真不知为什么……connected是正常初始化且在变成FALSE后再次被赋予TRUE的啊……
另,为什么MAXNUM不能是超过100000的数?int的取值范围是大于100000的啊?WHY?
...全文
相关推荐
并查集初步,acm相关
在ACM(国际大学生程序设计竞赛)中,这种数据结构常常被用于解决一些涉及到关系网络的问题,例如亲戚关系的查询、网络连通性判断等。并查集的核心操作包括:1.
ACM算法-并查集详解
"并查集是一种用于处理不相交集合合并问题的数据结构,它通过树形结构实现。主要操作包括合并集合、判断元素是否属于同一集合以及路径压缩。在ACM算法中,这一数据结构经常被用到。"并查集是一种在计算机
acm并查集资料整理
通过深入理解和熟练掌握并查集,参赛者可以在ACM比赛中解决一系列与连通性相关的问题,提高算法的效率,赢得比赛的优势。
acm程序设计课件:幷查集
这个课件是关于并查集在杭州电子科技大学ACM课程中的讲解,由刘春英教授分享,旨在帮助学生理解并查集的原理和应用。首先,我们来了解并查集的基本概念。
并查集(ACM 算法)
并查集是一种在图论和算法设计中常用的离散数据结构,主要应用于处理不相交集合的联合与查询问题。在ACM(国际大学生程序设计竞赛)中,它经常被用来解决各种组合优化和图论问题。



