定义
普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树。
原理
设图 G = (V,E)所有顶点的集合为V,MST中顶点的集合为T。
① 从G中选取任意顶点作为MST的根,将其添加至T。
② 循环执行下述处理直至T=V
在连接T内顶点与V-T内顶点的边中选取权值最小的边 ( ),将其作为MST的边,并将 u 添至T。
实现
代码
#include<bits/stdc++.h> using namespace std; const int inf= 0x3f3f3f3f ; const int maxn= 1005 ; struct node { int v,w; node(){} node( int a, int b) {v=a;w= b;} }; vector <node> edge[maxn]; int n,m; void prim(); int main() { int i, from ,to,w; scanf( " %d%d " ,&n,& m); for (i= 0 ;i<m;i++ ) { scanf( " %d%d%d " ,& from ,&to,& w); edge[ from ].push_back(node(to,w)); edge[to].push_back(node( from ,w)); } prim(); system( " pause " ); return 0 ; } void prim() { int i,j,k,f,mmin,sum= 0 ,vis[maxn]={ 0 },dis[maxn]; fill(dis,dis + maxn,inf); dis[ 0 ]= 0 ; for (i= 0 ;i<=n;i++ ) { mmin = inf; for (j= 0 ;j<=n;j++ ) if (!vis[j]&&mmin> dis[j]) mmin =dis[f= j]; sum += mmin; vis[f] = 1 ; for (j= 0 ;j<edge[f].size();j++ ) { if (!vis[edge[f][j].v]&&dis[edge[f][j].v]> edge[f][j].w) dis[edge[f][j].v] = edge[f][j].w; } } printf( " 最小生成树的权值为%d " ,sum); }
挑战程序设计竞赛(第2版)
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://www.haodehen.cn/did238308