1. 程式人生 > >公路村村通(PTA)

公路村村通(PTA)

現有村落間道路的統計資料表中,列出了有可能建設成標準公路的若干條道路的成本,求使每個村落都有公路連通所需要的最低成本。

輸入格式:

輸入資料包括城鎮數目正整數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>
using namespace std;

#define INF 0x3f3f3f3f
int x[1003][1003];
int n,m;
void Create()
{
    int a,b,c;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            x[i][j]=INF;
        }
    }
    for(int i=1;i<=m;i++)
    {
        cin>>
a>>b>>c; x[a][b]=c; x[b][a]=x[a][b]; } } int Judge() { int min,sum=0; int a[1001]; a[1]=0; for(int i=2;i<=n;i++) { a[i]=x[1][i]; } for(int i=2;i<=n;i++) { min=INF; int j=1; int r=0; while(j<=n)
{ if(a[j]!=0&&a[j]<min) { min=a[j]; r=j; } j++; } if(r==0)return -1; sum+=min; a[r]=0; for(j=2;j<n;j++) { if(a[j]!=0&&x[r][j]<a[j]) { a[j]=x[r][j]; } } } return sum; } int main() { cin>>n>>m; Create(); int t=Judge(); cout<<t; return 0; }