prim算法

来源:互联网 发布:鼎锐软件科技有限公司 编辑:程序博客网 时间:2024/05/16 19:53

最小生成树:在一个具有几个顶点的连通图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 0xfffffusing 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;}

	
				
		
原创粉丝点击