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
思路:
-
最小生成树的题 ,这里采用 P r i m e Prime Prime 算法
-
算法流程 可以参考这个视频
- 任意选择一个点作为起始点 ,一般选择第一个点
- 扫描与该点相连接的点 ,将距离存储在
minDist
中 ,并且标记该顶点即minDist[1]=0
(自己到自己的距离为 0 0 0 ) - 从
minDist
中找出距离最小的点 ,作为第二个顶点 ,标记该顶点 - 扫描与该点相连接的点 ,将距离更新并且存储在
minDist
中 - 重复至所有顶点加入到
minDist
中
#include<iostream>
#include<stdio.h>
#include<set>
#include<algorithm>
#include<cmath>
#include<map>
#include<vector>
#include<string.h>
#include<stack>
#include<cctype>
#include<map>
#include<queue>
using namespace std;
#define inf 0x3f3f3f3f
typedef long long ll;
int g[1001][1001],n,m,u,v,weight;
int prime()
{
int min;
int minDist[1001];
int cost=0;
minDist[1]=0;
for(int i=2;i<=n;i++)
{
minDist[i]=g[1][i];
}
for(int i=2;i<=n;i++)
{
min=inf;
int j=1,k=0;
while(j<=n)
{
if(minDist[j]!=0 && minDist[j]<min)
{
min=minDist[j];
k=j;
}
j++;
}
if(k==0) return -1;
cost+=min;
minDist[k]=0;
for(int j=2;j<=n;j++)
{
if(minDist[j]!=0 && g[k][j]<minDist[j])
{
minDist[j]=g[k][j];
}
}
}
return cost;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
g[i][j]=inf;
}
}
for(int i=1;i<=m;i++)
{
cin>>u>>v>>weight;
g[u][v]=weight;
g[v][u]=weight;
}
int ans=prime();
printf("%d",ans);
return 0;
}