5-9 公路村村通 (30分)
现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本。
输入格式:
输入数据包括城镇数目正整数NN(\le 1000≤1000)和候选道路数目MM(\le 3N≤3N);随后的MM行对应MM条道路,每行给出3个正整数,分别是该条道路直接连通的两个城镇的编号以及该道路改建的预算成本。为简单起见,城镇从1到NN编号。
输出格式:
输出村村通需要的最低成本。如果输入数据不足以保证畅通,则输出-1−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
Think:最小生成树
#include <bits/stdc++.h>
using namespace std;
const int inf=0x7fffffff;
int n,m,a[1024][1024],b[1024];
void prim(){
int ans,i,j,v,min;
for (i=0;i<n;i++)
b[i]=a[0][i];
b[0]=-1;
ans=0;
for (i=1;i<n;i++){
min=inf;
v=-1;
for (j=0;j<n;j++){
if (b[j]<min&&b[j]!=-1){
min=b[j];
v=j;
}
}
if (v!=-1){
ans+=b[v];
b[v]=-1;
for (j=0;j<n;j++){
if (a[v][j]<b[j])
b[j]=a[v][j];
}
}
}
for (i=0;i<n;i++){
if (b[i]!=-1){
break;
}
}
if (i<n){
ans=-1;
}
printf("%d\n",ans);
}
int main(){
int x,y,z;
scanf("%d%d",&n,&m);
for (int i=0;i<n;i++){
for (int j=0;j<n;j++){
if (i==j){
a[i][j]=0;
}
else{
a[i][j]=inf;
}
}
}
for (int i=0;i<m;i++){
scanf("%d%d%d",&x,&y,&z);
x--;
y--;
a[x][y]=a[y][x]=min(a[x][y],z);
}
prim();
return 0;
}