题目1017:还是畅通工程(最小生成树)

问题来源

  http://ac.jobdu.com/problem.php?pid=1017

问题描述

  给你n个村庄,给出各个村庄之间的距离,求最小生成树。

问题分析

  纯粹的求最小生成树问题。请参考:最小生成树(Prim算法+Kruskal算法)

参考代码

//
// Created by AlvinZH on 2017/5/3.
// Copyright (c) AlvinZH. All rights reserved.
//

#include<iostream>
#include<string>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;

const int INF=0x3f3f3f3f;
const int N=101;

int G[N][N];//邻接矩阵
int Lowest[N];//权值数组,表示和已选顶点的最小权值,Lowest[i]=0表示点i已经在Vnew中
int n,m;

int prim()
{
    int Num=0;//最小生成树权值

    for(int i=2;i<=n;i++)//选取第一个点开始
        Lowest[i]=G[1][i];//取第一行权值

    for(int i=1;i<n;i++)//找到新顶点加入(n-1个)
    {
        int minid=0;
        int mindis=INF;
        for(int j=2;j<=n;j++)//找到距离最小的
        {
            if(Lowest[j]!=0&&Lowest[j]<mindis)
            {
                mindis=Lowest[j];
                minid=j;
            }
        }
        Num+=mindis;
        Lowest[minid]=0;//把点minid加入Vnew

        for(int j=2;j<=n;j++)//更新Lowest数组
            if(Lowest[j]>G[minid][j])
                Lowest[j]=G[minid][j];
    }
    return Num;
}

int main()
{
    while(~scanf("%d",&n)&&n!=0)
    {
        memset(G,0x3f,sizeof(G));//初始化为最大值
        for(int i=1;i<=n;i++)//对角线为0
            G[i][i]=0;

        m=(n*(n-1))/2;
        int u,v,w;
        for(int i=1;i<=m;i++)
        {
            scanf("%d%d%d",&u,&v,&w);
            G[u][v]=G[v][u]=w;
        }

        int MST=prim();//计算最小生成树总权值

        printf("%d
",MST);
    }
}

作者: AlvinZH

出处: http://www.cnblogs.com/AlvinZH/

本人Github:https://github.com/Pacsiy/JobDu

本文版权归作者AlvinZH和博客园所有,欢迎转载和商用,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

原文地址:https://www.cnblogs.com/AlvinZH/p/6803734.html