现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本。
输入格式:
输入数据包括城镇数目正整数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 <stdio.h>
#define MAXnum 1003
#define Max 65535
int arcs[MAXnum][MAXnum];
int vex, arc;
void Create() //初始化+创建无向图
{
for (int i = 1; i <= vex; i++)
{
for (int j = 1; j <= vex; j++)
arcs[i][j] = Max;
}
int n, m, v;
for (int i = 1; i <= arc; i++)
{
scanf("%d%d%d", &n, &m, &v);
arcs[n][m] = v;
arcs[m][n] = v;
}
}
int prim() //普利姆算法
{
int i, j,k,min;
int cost=0;
int v[MAXnum];
v[1] = 0;//将1加入生成树
for (i = 2; i <= vex; i++)//初始化到各点所需的钱
{
v[i] = arcs[1][i];
}
for (i = 2; i <= vex; i++)
{
k = 0;
j = 1;
min = Max;
while (j <= vex)
{
if (v[j] != 0 && v[j] < min)
{
min = v[j];
k = j;
}
j++;
}
if (k == 0)
return -1;
cost = cost + min;
v[k] = 0;
for (int j = 2; j <= vex; j++)
{
if (arcs[k][j] < v[j])
{
v[j] = arcs[k][j];
}
}
}
return cost;
}
int main()
{
scanf("%d%d", &vex, &arc);
Create();
int a;
a = prim();
printf("%d", a);
return 0;
}
博客探讨了如何通过建立最小生成树,运用普利姆算法来解决村落间公路连通的最低成本问题。输入和输出格式、样例及思路被详细阐述。
1163

被折叠的 条评论
为什么被折叠?



