并查集+Kruscal最小生成树; 温习了一下并查集, 同时又对静态数组的动态使用体会了一下;.

#include <stdlib.h> #include <stdio.h> const int MAXN=10000; int u[MAXN]; //边的起点 int v[MAXN]; //边的终点 int w[MAXN]; //边的权值 int r[MAXN]; //间接排序 int p[MAXN]; //并查集 int n; //顶点的数量 int m; //边的数量 int cmp(const void *a,const void *b) { int *p=(int*)a; int *q=(int*)b; if(w[*p]<w[*q]) { return -1; } else if(w[*p]==w[*q]) { return 0; } else { return 1; } } int find(int x) { return p[x]==x ? x:p[x]=find(p[x]); } int kruscal() { for(int j=0;j<n;++j) { p[j]=j; } for(int k=0;k<m;++k) { r[k]=k; } qsort(r,m,sizeof(int),cmp); //按w排序,只是间接对下标的排序 int ret=0; for(int i=0;i<m;++i) { int e=r[i]; int x=find(u[e]); int y=find(v[e]); if(x!=y) { ret+=w[e]; p[y]=x; } } return ret; } int main() { scanf("%d%d",&n,&m); for(int i=0;i<m;++i) { int a,b,c; scanf("%d%d%d",&a,&b,&c); u[i]=a; v[i]=b; w[i]=c; } printf("%d/n",kruscal()); return 0; }

 

 

有个总结, 做算法题, 别开辟内存, 直接全局变量尽量开大, 动态的结构用数组和STL的数据结构直接写成静态的, 这样显得更加帅气.

 

另外, 最小生成树算法又称作MST算法,Minimal Spanning Tree, 这样免得以后别人装X你听不懂.

 

并查集是Union-Find-Set.

 

《算法竞赛入门经典》 也看到尾声了, 最后这一段还有网络流的内容, 正好对前一阵的学习又可以加深理解, 完美!

你可能感兴趣的:(并查集+Kruscal最小生成树; 温习了一下并查集, 同时又对静态数组的动态使用体会了一下;.)