hdu 1162 裸最下生成树 prim

来源:互联网 发布:高中历史辅助教程 知乎 编辑:程序博客网 时间:2024/05/16 10:39

题意: 不解释,很简单。

思路: 刚刚开始准备用克鲁斯卡尔算法,但一想这是稠密图,故用prim算法解之,看下面代码吧, 好久没写代码了,准备各种考试,但是各种不顺,还是写代码爽,哈哈。。

代码:

#include <stdio.h>
#include <string.h>
#include <math.h>

#define N 105
#define INF 1 << 30

struct point
{
    double x, y;
}a[N];

int main()
{
    int i, j, k, n, v;
    double min, sum;
    double edge[N][N], dist[N], near[N];
    while(scanf("%d", &n) != EOF){
        memset(near, 0, sizeof(near));
        for(i = 1; i <= n; ++i){
            scanf("%lf %lf", &a[i].x, &a[i].y);
        }
        for(i = 1; i < n; ++i){
            for(j = i + 1; j <= n; ++j){
                edge[i][j] = edge[j][i] = (a[i].x - a[j].x) * (a[i].x - a[j].x)
                             + (a[i].y - a[j].y) * (a[i].y - a[j].y);
            }
        }
        for(i = 1; i <= n; ++i){
            dist[i] = edge[1][i];
        }
        near[1] = -1;
        sum = 0;
        for(i = 1; i < n; ++i){
            min = INF; v = -1;
            for(j = 1; j <= n; ++j){
                if(near[j] != -1 && dist[j] < min)
                    min = dist[j], v = j;
            }
            if(v != -1){
                sum += sqrt(min);
                near[v] = -1;
                for(j = 1; j <= n; ++j){
                    if(near[j] != -1 && edge[v][j] < dist[j]){
                        dist[j] = edge[v][j];
                    }
                }
            }
        }
        printf("%.2lf\n", sum);
    }
    return 0;    
}