双11狂欢大促

盲盒赢 定制羽绒服

开启惊喜盲盒,抽取你的专属好礼

— 惊喜奖品抢先看 —

【请教】acm--基于并查集

kewing kewing 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
请教HDOJ acm小希的迷宫:Problem: http://acm.hdu.edu.cn/showproblem.php?pid=1272

怎么都有问题,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?
...全文

相关推荐

评论 4
收藏 已收藏
分享
返回顶部
kewing
数据结构与算法 33,027 成员 35,334 内容