公路村村通

版权声明:沃斯里德小浩浩啊 https://blog.csdn.net/Healer66/article/details/82808392

7-10 公路村村通 (30 分)

现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本。

输入格式:

输入数据包括城镇数目正整数N(≤1000)和候选道路数目M(≤3N);随后的M行对应M条道路,每行给出3个正整数,分别是该条道路直接连通的两个城镇的编号以及该道路改建的预算成本。为简单起见,城镇从1到N编号。

输出格式:

输出村村通需要的最低成本。如果输入数据不足以保证畅通,则输出−1,表示需要建设更多公路。

输入样例:

6 15
1 2 5
1 3 3
1 4 7
1 5 4
1 6 2
2 3 4
2 4 6
2 5 2
2 6 6
3 4 6
3 5 1
3 6 1
4 5 10
4 6 8
5 6 3

输出样例:

12
#include <bits/stdc++.h>
#define INF 0x3f3f3f
using namespace std;
int Graph[1010][1010];
int M, N, minpri[1010];
bool vis[1010];
int prim()
{
    memset(vis,0,sizeof vis);
    int nextpt, cnt = 1, sum = 0;
    for(int i = 1; i <= N; ++i)
        minpri[i] = Graph[1][i];
    minpri[1] = 0;//到本身距离是0
    vis[1]=1;
    for(int i = 1; i < N; ++i)
    {
        nextpt = 0;
        int min_ = INF;
        for(int i = 1; i <= N; ++i)
        {
            if(!vis[i] && minpri[i] < min_)
            {
                min_ = minpri[i];
                nextpt = i;
            }
        }
        if(nextpt == 0)
            break;
        sum += minpri[nextpt];
        vis[nextpt]=1;
        for(int j = 1; j <= N; ++j)
            if(minpri[j] > Graph[nextpt][j])
                minpri[j] = Graph[nextpt][j];
        ++cnt;
    }

    if(cnt != N)
        return -1;
    else
        return sum;

}
int main()
{
    int pos1, pos2, val, minpri;
    cin>>N>>M;
    memset(Graph,INF,sizeof Graph);
    for(int i = 1; i <= M; ++i)
    {
        cin>>pos1>>pos2>>val;
        Graph[pos1][pos2]=Graph[pos2][pos1] = val;
    }
    minpri = prim();
    printf("%d\n", minpri);
}

猜你喜欢

转载自blog.csdn.net/Healer66/article/details/82808392