最小生成树 prim hdu1233 还是畅通工程

来源:互联网 发布:八国集团中国知乎 编辑:程序博客网 时间:2024/04/30 02:35

c++代码实现

#include<iostream>using namespace std;const int maxnum=105;const int maxint=99999;int map[maxnum][maxnum];int lowcost[maxnum];//记录的是以节点i为终点的最小边权值bool vis[maxnum];//标记已识别的点,相当于起点int dist;//记录最终的权值总和void Prim(int N,int map[maxnum][maxnum]){    //初始化    for(int i=1;i<=N;i++)    {        lowcost[i]=map[1][i];//以1为最初起点,i为终点的权值        vis[i]=0;    }    vis[1]=1;//第一个点已被标记    dist=0;//最初权值为0;    int u=1;    /* n个节点至少需要N-1条边构成最小生成树 */    for(int i=1;i<N;i++)    {        int temp=maxint;        //找到以u为终点的最小权值的边        for(int j=1;j<=N;j++)        {            if(!vis[j]&&lowcost[j]<temp)            {                u=j;                temp=lowcost[j];            }        }        //累计权值        dist=dist+temp;        //标记节点u到生成树        vis[u]=1;        //更新当前节点到其他节点的权值        for(int k=1;k<=N;k++)        {            //发现更小权值            if(!vis[k]&&map[u][k]<lowcost[k])                  lowcost[k]=map[u][k];        }    }    cout<<dist<<endl;}int main (){    int   N;//输入节点    while(cin>>N)    {        if(N==0)            break;        int A,B,D;//两个节点,及之间的距离                //初始化节点之间的距离,假设都不相连,无穷大(取无穷大为maxint)        for(int i=1;i<=N;i++)            for(int j=1;j<=N;j++)               map[i][j]=maxint;        //输入各个节点之间的距离        for(int i=1;i<=N*(N-1)/2;i++)        {            cin>>A>>B>>D;            if(D<maxint)             {                 map[A][B]=D;                 map[B][A]=D;//无向图             }        }        Prim(N,map);    }    return 0;}




0 0
原创粉丝点击