最小生成树
定义:
生成树:
对于一个子图,含有图中所有顶点,但只有足以构成树的n-1条边,这样的子图称为图的生成树;
最小生成树:
权值和最小的生成树叫做图的最小生成树。
这里记录一下Kruskal算法的模板
#include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #include <string> #include <stack> #include <queue> #include <cmath> #define ll long long #define pi 3.1415927 #define inf 0x3f3f3f3f using namespace std; struct node { int s,ends,cost; ///s和ends记录边的端点;cost记录权值 }a[1005]; bool cmp (node x, node y) { return x.cost<y.cost; } node p; int fat[1005]; ///利用并查集 int finds(int n) { if(n==fat[n]) return n; return fat[n]=finds(fat[n]); } void join (int x, int y) { int j=finds(x); int k=finds(y); if(j!=k) fat[j]=k; } int kruskal (int n,int m) { sort(a,a+m,cmp); ///按照权值从小到大排序 int i,sum=0; for(i=0;i<m;++i) { if(finds(a[i].s)!=finds(a[i].ends)) { /// 相等代表已经记录过了,再次join会形成环 join(a[i].s,a[i].ends); sum+=a[i].cost; } } return sum; } int main () { int n,m,i,t,j,k,x,y,p; cin>>n>>m; for(i=0;i<=n;++i) fat[i]=i; for(i=0;i<m;++i) { cin>>x>>y>>p; a[i].s=x; a[i].ends=y; a[i].cost=p; } k=kruskal(n,m); cout<<k; return 0; }