在已有的边上做Prim
#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;
#define infinity 1000000
class Point2D
{
public:
double x,y;
};
Point2D point[1001];
double map[1001][1001];
double dis[1001];
bool flag[1001];
int n,m;
int main()
{
memset(flag,false,sizeof(flag));
int c,i,j,k;
double len;
double minone;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
cin>>point[i].x>>point[i].y;
//初始化map
for(i=1;i<=n;i++)
map[i][i]=0;
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
{
map[i][j]=sqrt( pow(point[i].x-point[j].x,2)+pow(point[i].y-point[j].y,2) );
map[j][i]=map[i][j];
}
for(k=0;k<m;k++)
{
cin>>i>>j;
// len+=map[i][j];
map[j][i]=map[i][j]=0.0;
}
//下面用prim求最小生成树
for(k=1;k<=n;k++)
dis[k]=map[1][k];
flag[1]=true;
len=0.0;
for(c=1;c<n;c++)
{
minone=10000000.0;
for(i=1;i<=n;i++)
if(flag[i]==false && dis[i]<minone)
{
k=i;
minone=dis[i];
}
flag[k]=true;
len+=minone;
for(i=1;i<=n;i++)
if(flag[i]==false && map[k][i]<dis[i])
dis[i]=map[k][i];
}
cout<<setiosflags(ios::fixed)<<setprecision(2)<<len<<endl;
return 0;
}
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步