题意:给定N个村庄和两两村庄的距离,求将这N个村庄联通所需的最小电线长度。
思路:就是一道最小生成树的题,用prim或者kruskal都可以实现,我用的prim。
代码:
#include <iostream>
using namespace std;
#include <cstring>
#define MAXV 101
#define INF 0x3f3f3f3f
int map[MAXV][MAXV], n;
int Prim()
{
int v[MAXV] = {0}, dis[MAXV] = {0};
int result = 0;
v[1] = 1;
for(int i = 2; i <= n; i++)
{
dis[i] = map[1][i];
}
for(int i = 1; i < n; i++)
{
int min = INF, temp;
/*找出离起始点最短距离的结点*/
for(int j = 1; j <= n; j++)
{
if(v[j] == 0 && min > di])
{
min = dis[j];
temp = j;
}
}
//由于每次取的是最小,所以一直累加,得到的最后结果就是答案
result += min;
v[temp] = 1;
//这里是和dijkstra算法不同之处,dijkstra算法是源点到未记录集合的最短距离,prim算法是已记录集合到未记录集合的最短距离。
for(int j = 1; j <= n; j++)
{
//dijkstra算法应该写为 if(v[j] == 0 && dis[temp] + map[temp][j] < dis[j])
if(v[j] == 0 && map[temp][j] < dis[j])
{
dis[j] = map[temp][j];
}
}
}
return result;
}
int main()
{
int v, ans;
while(scanf("%d", &n) != EOF)
{
memset(map, INF, sizeof(map));
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
scanf("%d", &v);
map[i][j] = map[j][i] = v;
}
}
ans = Prim();
cout<<ans<<endl;
}
return 0;
}
本文介绍了一种解决村庄间电线连接问题的方法,通过使用Prim算法寻找最小生成树来达到最小化总连线长度的目的。文章提供了详细的算法实现过程及代码示例。
1913

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



