算法竞赛模板 最小生成树
①克鲁斯卡尔算法(Kruskal) n 是顶点数, m 是边数; cnt 是已连的边数,如果已连的边数=总点数-1,即可跳出。 #include<bits/stdc++.h> #define MAX 1005 using namespace std; int p[MAX],n,m; struct edge{ int x,y,w; }a[MAX]; int find(int r) { if(p[r]!=r) p[r]=find(p[r]); return p[r]; } void join(int x,int y) { int fx=find(x),fy=find(y); if(fx!=fy) p[fx]=fy; } void init() { for(int i=0;i<=MAX;i++) p[i]=i; } bool cmp(edge a,edge b) { return a.w<b.w; } int kruskal() { sort(a,a+m,cmp); int cnt=0,cost=0,i; for(i=0;i<m;i++) { int fx=find(a[i].x),fy=find(a[i].y); if(fx!=fy) { p[fx]=fy; cost+=a[i].w; cnt++; } if(cnt==n-1)break; } return cost; } int