SDUT 3362 数据结构实验之图论六:村村通公路

 

数据结构实验之图论六:村村通公路

Time Limit: 1000 ms Memory Limit: 65536 KiB

Problem Description

当前农村公路建设正如火如荼的展开,某乡镇政府决定实现村村通公路,工程师现有各个村落之间的原始道路统计数据表,表中列出了各村之间可以建设公路的若干条道路的成本,你的任务是根据给出的数据表,求使得每个村都有公路连通所需要的最低成本。

Input

连续多组数据输入,每组数据包括村落数目N(N <= 1000)和可供选择的道路数目M(M <= 3000),随后M行对应M条道路,每行给出3个正整数,分别是该条道路直接连通的两个村庄的编号和修建该道路的预算成本,村庄从1~N编号。 

Output

输出使每个村庄都有公路连通所需要的最低成本,如果输入数据不能使所有村庄畅通,则输出-1,表示有些村庄之间没有路连通。 

Sample Input

5 8
1 2 12
1 3 9
1 4 11
1 5 3
2 3 6
2 4 9
3 4 4
4 5 6

Sample Output

19

提示:本题应用最小生成树的知识点,prim算法,间接用到了贪心,不断更新图中每个点到每个点之间的成本,使其变成最低。

代码实现如下(g++):
#include<bits/stdc++.h>
#define MAX 0x3f3f3f3f

using namespace std;

int Map[1100][1100];
int vis[1100];
int lowcost[1100];
int flag,sum;

void prim(int n)//找最小生成树的prim算法
{
    flag=0;
    sum=0;
    int k=1;
    for(int i=1; i<=n; i++)
    {
        lowcost[i]=Map[i][1];//让lowcost数组等于该村庄到1的成本
    }
    vis[1]=1;
    for(int i=1; i<n; i++)
    {
        int t=MAX;
        for(int j=1; j<=n; j++)
        {
            if(!vis[j]&&Map[j][k]<lowcost[j])//将各点的最低成本更新进去
            {
                lowcost[j]=Map[j][k];
            }
        }
        for(int j=1; j<=n; j++)
        {
            if(!vis[j]&&t>lowcost[j])//找最低的成本
            {
                t=lowcost[j];
                k=j;
            }
        }
        if(t==MAX)//当不能使所有村庄连通时,停止
        {
            flag=1;
            return ;
        }
        vis[k]=1;
        sum+=t;
    }
}

int main()
{
    int n,m,u,v,c,i,j;
    while(~scanf("%d %d",&n,&m))
    {
        for(i=1; i<=n; i++)
        {
            for(j=1; j<=n; j++)
            {
                if(i==j)
                    Map[i][j]=0;
                else
                    Map[i][j]=MAX;
            }
        }
        memset(vis,0,sizeof(vis));
        for(i=0; i<m; i++)
        {
            scanf("%d %d %d",&u,&v,&c);
            if(Map[u][v]>c)
            {
                Map[u][v]=Map[v][u]=c;
            }
        }
        prim(n);
        if(!flag)
        {
            printf("%d\n",sum);
        }
        else
            printf("-1\n");
    }
    return 0;
}



/***************************************************
Result: Accepted
Take time: 4ms
Take Memory: 920KB
****************************************************/

 

    原文作者:孑丶然
    原文地址: https://www.cnblogs.com/jkxsz2333/p/9506444.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞