您的位置:首页 > 其它

POJ 2560 Freckles(最小生成树)

2014-11-09 22:22 357 查看
题目大意:有n个点,并且知道它们的坐标,求连接所有点的最短路径。
题目分析:
算法:prime算法
1.任选一个点,加入树中,作为第一个树中的点。
2.取距离现有树距离最小的点,加入树中。
3.重复步骤2, 直至所有点都加入到树中。

#include <cstdio>
#include <cmath>
#include <iostream>
using namespace std;
#define INF 1 << 29
int n;
double map[101][101];
int vis[101];
double dis[101];
double prim(int x) {
int i, j, k;
double ans = 0;
for(i = 0; i < n; i ++) {
vis[i] = 0;
dis[i] = map[x][i];
}
vis[0] = 1;
for(i = 1; i < n; i ++) {
double min = INF;
for(j = 0; j < n; j ++)	{
if(min > dis[j] && !vis[j]) {
min = dis[j];
k = j;
}
}
vis[k] = 1;
ans += min;
for(j = 0;j < n; j ++) {
if(dis[j] > map[k][j] && !vis[j]) {
dis[j] = map[k][j];
}
}
}
return ans;
}
int main() {
int i, j;
int k = 0;
double x[101];
double y[101];
scanf("%d", &n);
for (i = 0; i < 101; i ++)
for (j = 0; j < 101; j ++)
map[i][j] = 0;
for(i = 0; i < n; i ++)
scanf("%lf%lf", &x[i], &y[i]);
for(i = 0; i < n; i ++)
{
for(j = i + 1; j < n; j ++)
{
map[i][j] = map[j][i] = sqrt(double((x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j])));
}
}
printf("%.2lf\n", prim(0));
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: