Kruskal算法。先按length用qsort排序,再利用并查集来做。 我一开始给并查集操作加上了路径压缩,但后来我把那段代码去掉后再提交,运行时间却基本没变化。 #include <iostream> using namespace std; struct node { int length; short first; short second; }; short parent[1005]; node my_pair[15005]; int Find(int x) { int root=x; while(parent[root]>0) root=parent[root];//寻找根节点 return root; } int Union(int x,int y) { if(parent[x]>parent[y]) { parent[y]+=parent[x]; parent[x]=y; return -parent[y]; } else { parent[x]+=parent[y]; parent[y]=x; return -parent[x]; } } int my_cmp(const void* a,const void* b) { node* first=(node*)a; node* second=(node*)b; return first->length-second->length; } int main() { freopen("d://1.txt","r",stdin); int N,M,count,first_root,second_root; scanf("%d%d",&N,&M); memset(parent,0xff,sizeof(parent)); for(int i=1;i<=M;i++) { scanf("%hd%hd%d",&my_pair[i].first,&my_pair[i].second,&my_pair[i].length); } qsort(my_pair+1,M,sizeof(node),my_cmp); for(count=1;count<=M;count++) { first_root=Find(my_pair[count].first); second_root=Find(my_pair[count].second); if(first_root!=second_root) { if(Union(first_root,second_root)==N) break; } } printf("%d/n",my_pair[count].length); printf("%d/n",count); for(int i=1;i<=count;i++) { printf("%hd %hd/n",my_pair[i].first,my_pair[i].second); } return 0; }