PTA-08-图7 公路村村通

题目描述

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

输入格式:

输入数据包括城镇数目正整数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
#include
using namespace std;
#define Inf 0x3f3f3f3f;
int map[1001][1001];
int dist[1001];
int parent[1001];
int N,M;
int cnt;

int find_min()
{
    int min=Inf;
    int index=-1;
    for(int i=1;i<=N;i++){
        if(dist[i]!=0&&dist[i]<min){
            min=dist[i];
            index=i;
        }
    }
    return index;
}
void prim(int s)
{
    int cnt=1,total_cost=0;
    for(int i=1;i<=N;i++){
        parent[i]=s;
        dist[i]=map[s][i];
    }
    parent[s]=-1;
    int v;
    while(true){
        v=find_min();
        if(v==-1)break;
        total_cost+=dist[v];
        cnt++;
        dist[v]=0;//收录后 距离为0
        for(int i=1;i<=N;i++){
            if(dist[i]!=0&&map[v][i]<dist[i]){
                dist[i]=map[v][i];
                parent[i]=v;
            }
        }
    }
    if(cnt==N) cout<<total_cost<<endl;
    else cout<<"-1"<<endl;
}
int main()
{
    cin>>N>>M;
    for(int i=1;i<=N;i++){
        for(int j=1;j<=N;j++){
            if(i==j) map[i][j]=map[j][i]=0;
            else map[i][j]=map[j][i]=Inf;
        }
    }

    for(int i=1;i<=M;i++){
        int v1,v2,cost;
        cin>>v1>>v2>>cost;
        map[v1][v2]=map[v2][v1]=cost;
    }
    prim(1);

    return 0;
}

你可能感兴趣的:(PTA)