POJ 2560 Freckles(最小生成树)

来源:互联网 发布:mac照片导出到移动硬盘 编辑:程序博客网 时间:2024/06/04 08:48
题目大意:有n个点,并且知道它们的坐标,求连接所有点的最短路径。
题目分析:
算法:prime算法
1.任选一个点,加入树中,作为第一个树中的点。
2.取距离现有树距离最小的点,加入树中。
3.重复步骤2, 直至所有点都加入到树中。


#include <cstdio>#include <cmath>#include <iostream>using namespace std;#define INF 1 << 29int 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;}


0 0
原创粉丝点击