低级错误,困扰了我整整两天!kruskal方法用于求最小生成树,对于属于不同set的节点进行合并时需要找到相应的set的根节点root1和root2,将root1的父节点指针指向root2或者相反。切莫只是改变当前节点的指针。就是这个低级的错误是我同提交了89次才终于成功!89次!!
#include <stdio.h>
#include <stdlib.h>
#define NUM 105
typedef struct ee{
int from;
int to;
int cost;
}EdgeNode;
int cmp(const void * a,const void * b){
return (*((EdgeNode *)a)).cost-(*((EdgeNode *)b)).cost;
}
EdgeNode edge[NUM*NUM];
int father[NUM];
void makeset(){
for(int k=0;k<NUM;k++){
father[k]=k;
}
}
int findroot(int a){
if(father[a]!=a){
father[a]=findroot(father[a]);
}
return father[a];
}
int main(){
int w;
while(scanf("%d",&w)!=EOF){
int edgenu=w*(w-1)/2;
int edgeindex=0;
for(int i=0;i<w;i++){
for(int j=0;j<w;j++){
int l;
scanf("%d",&l);
if(i>j){
edge[edgeindex].from=i;
edge[edgeindex].to=j;
edge[edgeindex].cost=l;
edgeindex++;
}
}
}
qsort(edge,edgenu,sizeof(EdgeNode),cmp);
makeset();
int edgenum=0;
int su=0;
int index;
for(index=0;index<=edgenu;index++){
int cost=edge[index].cost;
int from=edge[index].from;
int to=edge[index].to;
from=findroot(from);
to=findroot(to);
if(from!=to){
su+=cost;
father[from]=to;
++edgenum;
if(edgenum==w-1)
break;
}
}
printf("%d\n",su);
}
return 0;
}