。很水,不说话了,直接睇代码吧
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<queue>
using namespace std;
#define N 2010
double x[N],y[N];
double map[N][N],dist[N];
bool vis[N];
int n,m;
double dis(double x,double y,double x1,double y1)
{
return sqrt((x1-x)*(x1-x)+(y1-y)*(y1-y));
}
double Prim()
{
double sum=0.0;
int i,j;
for(i=0;i<=n;i++)
{
dist[i] = map[1][i];
vis[i] = 0;
}
int u;
for(i=0;i<=n;i++)
{
double low = 99999999;
u = 0;
for(j=1;j<=n;j++)
{
if( !vis[j] && dist[j] < low )
{
low = dist[j];
u = j;
}
}
if(low == 99999999)
break;
sum += low;
vis[u] = true;
for(j=1;j<=n;j++)
{
if( !vis[j] && dist[j] > map[u][j] )
dist[j] = map[u][j];
}
}
return sum;
}
int main()
{
int i,j,u,v;
while(~scanf("%d%d",&n,&m))
{
for(i=1;i<=n;i++)
scanf("%lf%lf",&x[i],&y[i]);
for(i=1;i<=n;i++)
{
for(j=i+1;j<=n;j++)
map[i][j] = map[j][i] = dis(x[i],y[i],x[j],y[j]);
}
for(i=0;i<m;i++)
{
scanf("%d%d",&u,&v);
map[u][v] = map[v][u] = 0;
}
memset(vis,false,sizeof(vis));
printf("%.2f\n",Prim());
}
return 0;
}