最小生成树:在一个具有几个顶点的连通图G中,如果存在子图G'包含G中所有顶点和一部分边,且不形成回路,则称G'为图G的生成树,代价最小生成树则称为最小生成树。
•算法过程
–从单一顶点的树T开始
–不断加入耗费最小的边(u, v),使T∪{(u, v)}仍为树 ——u、v中有一个已经在T中,另一个不在T中
//prim算法求最小生成树 #include <iostream> #include<cstdio> #include<cstring> #define MAX 22 #define VALUE 0xfffff using namespace std; int g[MAX][MAX]; int minCost[MAX];//表示被加到最小生成树的点的集合 bool used[MAX]; int v,e; void createGraph() { int start,end,weight; scanf("%d%d",&v,&e); //从1开始 memset(g,0,sizeof(g)); for(int i=0;i<e;i++) { scanf("%d%d%d",&start,&end,&weight); g[start][end]=weight; g[end][start]=g[start][end]; } } //返回最小生成树的总大小 int prim() { for(int i=0;i<=v;i++) { minCost[i]=VALUE; used[i]=false; } minCost[1]=0; int res=0; int u; while(true) { int t=-1; for(u=1;u<=v;u++) { if(!used[u] && (t==-1 || (minCost[t]>minCost[u] && minCost[u]!=0))) t=u; } if(t==-1) break; used[t]=true; res+=minCost[t]; printf("%d\t",minCost[t]); for(u=1;u<=v;u++) { if(minCost[u]>g[t][u] && g[t][u]!=0) minCost[u]=g[t][u]; } } return res; } int main() { createGraph(); int path=prim(); printf("%d\n",path); return 0; }