kruskal模板:
#include<iostream> #include<bits/stdc++.h> using namespace std; const int MAXN=10000; const int MAXM=10000; struct edge { int u,v,w; }e[MAXM]; bool cmp(edge a,edge b) //重要! { if(a.w<b.w) return true; else return false; } //并查集(确定有无回路 int father[MAXN]; int get(int a) { if(father[a]==a) return a; return father[a]=get(father[a]); } void merge(int a,int b) { a=get(a); b=get(b); if(a!=b) father[a]=b; } int main() { int n,m; cin>>n>>m; for(int i=1;i<=m;i++) scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w); sort(e+1,e+m+1,cmp); //把边按边权排序! for(int i=1;i<=n;i++) father[i]=i; int res=0; //记录添加到最小生成树中的边数(最终=n-1即可 !!! int ans=0; //记录边权值和 for(int i=1;i<=m && res<n-1;i++) { int u=e[i].u; int v=e[i].v; if(get(u)==get(v)) //若产生回路,不加这条边 continue; else //否则加这条边 { res++; //记录最小生成树中的边数 merge(u,v); ans+=e[i].w; } } cout<<ans; return 0; }
prim算法模板
/* * 数组tree[]用来记录最小生成树的节点 * 数组lowdis[]记录从起点到其余所有点的距离并不断更新 * 数组map[][]记录所有数据两点之间的距离 * point是所有节点的数目,begin是起点 * mindis是最小生成树的长度 */ void prime() { int i,j,min,mindis=0,next; memset(tree,0,sizeof(tree)); for(i=1;i<=point;i++) { lowdis[i]=map[begin][i];//用lowdis[]数组记录下从起点到剩下所有点的距离 } tree[begin]=1;//标记起点(即最小生成树中的点) for(i=1;i<point;i++) { min=INF; for(j=1;j<=point;j++) { if(!tree[j]&&min>lowdis[j]) { min=lowdis[j];//求出从当前起点到其余所有点的距离中最短的 next=j; } } mindis+=min;//记录下整条最小树的长度 tree[next]=1; for(j=1;j<=point;j++) { if(!tree[j]&&lowdis[j]>map[next][j]) lowdis[j]=map[next][j];//更新lowdis[]数组 } } printf("%d\n",mindis); }