最小生成树算法常见的有两种 Prim算法和Kruskal算法,两种算法所用的数据结构有所差异。 1.读入边 2.kruskal
#include<iostream> #include<cstdio> using namespace std; const int maxn=20010; struct edge { int u; int v; int w; edge(int _u,int _v,int _w):u(_u),v(_v),w(_w) {} edge() {} }; vector<edge> a; int m,n; bool cmp(edge a,edge b) { return a.w<b.w; } int find(int x) { return v[x]==x?x:v[x]=find(v[x]); } void read() { int u,v,w; scanf("%d %d",&n,&m); for(int i=0;i<m;i++) { scanf("%d %d %d",&u,&v,&w); a.push_back(e(u,v,w)); } } void kruskal() { int ans=0; for(int i=0;i<n;i++) v[i]=i; sort(a.begin(),a.end(),cmp); for(int i=0;i<m;i++) { int x=find(a[i].u); int y=find(a[i].v); if(x==y) continue; else { ans+=a[i].w; v[x]=y; } } return ans; }从小到大选取最小边,判断选取的边是否能够构成环,如果可以就不加入这条边,如果不行就加上,直到所有的边都找完,也可以通过判断是否加入的边等于n-1,如果最后小于n-1,则这图并不是连通的,如果到了n-1那么就不用再判断后面的边是否需要加入了。
