剑鱼行动
题目链接:剑鱼行动
题目描述
给出N个点的坐标,对它们建立一个最小生成树,代价就是连接它们的路径的长度,现要求总长度最小。N的值在100以内,坐标值在[-10000,10000].结果保留二位小数
输入格式
输入一个数n(n<=100),第2~n+1行输入每个点的坐标。
输出格式
一个二位小数,表示连接它们的路径的长度。
输入输出样例
输入
5
0 0
0 1
1 1
1 0
0.5 0.5
输出
2.83
解题思路
这道题就是一道比较简单的最短路,先处理数据,再kruskal就好了。
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int n,v[110];
double b[110][110],a[110][5],minn[110];
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
scanf("%lf%lf",&a[i][1],&a[i][2]);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
b[i][j]=sqrt(abs(a[i][1]-a[j][1])*abs(a[i][1]-a[j][1])//勾股
+abs(a[i][2]-a[j][2])*abs(a[i][2]-a[j][2]));////////////
memset(minn,100,sizeof(minn));
minn[1]=0;
for(int i=1;i<=n;i++)kruskal
{
int k=0;
for(int j=1;j<=n;j++)
if(!v[j]&&(minn[j]<minn[k]))
k=j;
v[k]=1;
for(int j=1;j<=n;j++)
if(!v[j]&&(b[j][k]<minn[j])&&b[j][k]!=0)
minn[j]=b[j][k];
}
double ans=0;
for(int i=1;i<=n;i++)
ans+=minn[i];
printf("%0.2lf",ans);
}
本文详细解析了一道经典的最小生成树问题“剑鱼行动”,通过使用Kruskal算法解决N个点坐标之间的最短路径问题,旨在帮助读者理解并掌握最小生成树的构建过程。
778

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



