POJ 1258 lightblueme Agri Net angry!89次的失误终于得到最后的成功

来源:互联网 发布:淮北网络玩家主题酒店 编辑:程序博客网 时间:2024/06/05 11:32

低级错误,困扰了我整整两天!kruskal方法用于求最小生成树,对于属于不同set的节点进行合并时需要找到相应的set的根节点root1和root2,将root1的父节点指针指向root2或者相反。切莫只是改变当前节点的指针。就是这个低级的错误是我同提交了89次才终于成功!89次!!

#include <stdio.h>#include <stdlib.h>#define NUM 105typedef 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;}