标签:
3.41
题目大意:给你N个点的坐标,求能使这N个点相连的所有边的最小距离是多少。
思路:先求出每个点和其他点的距离,存到图中,用Prim模板来做。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
struct Node
{
double x;
double y;
}A[110];
double G[110][110],low[110];
int vis[110];
void Prim(int N)
{
memset(vis,0,sizeof(vis));
int pos = 1;
vis[pos] = 1;
double ans = 0;
for(int i = 1; i <= N; i++)
if(i != pos)
low[i] = G[pos][i];
for(int i = 1; i < N; i++)
{
double Min = 0x7ffffff;
for(int j = 1; j <= N; j++)
{
if(!vis[j] && Min > low[j])
{
Min = low[j];
pos = j;
}
}
vis[pos] = 1;
ans += Min;
for(int j = 1; j <= N; j++)
{
if(!vis[j] && low[j] > G[pos][j])
low[j] = G[pos][j];
}
}
printf("%.2lf\n",ans);
}
int main()
{
int N;
double Dist,x,y;
while(cin >> N)
{
for(int i = 1; i <= N; i++)
{
for(int j = 1; j <= N; j++)
G[i][j] = 0x7fffff;
}
memset(A,0,sizeof(A));
for(int i = 1; i <= N; i++)
{
cin >> A[i].x >> A[i].y;
}
for(int i = 1; i <= N; i++)
{
for(int j = 1; j <= N; j++)
{
x = A[i].x - A[j].x;
y = A[i].y - A[j].y;
Dist = sqrt(x*x+y*y);
G[i][j] = Dist;
}
}
Prim(N);
}
return 0;
}
标签:
原文地址:http://blog.csdn.net/lianai911/article/details/42147559