Hoj 1811 Freckles

来源:互联网 发布:ios9.3.3完美越狱mac 编辑:程序博客网 时间:2024/06/05 16:24

最小生成树。Prim。

题目连接:http://acm.hit.edu.cn/hoj/problem/view?id=1811

对于Double min的初始化,0x7f起不到预期的效果.赋一个相对大的数即可-10000

#include <iostream>#include <stdio.h>#include <string.h>#include <queue>#include <math.h>#include <algorithm>using namespace std;double map[200][200];double dist[200];int visited[200];struct Point{    double x;    double y;};Point p[200];int main(){#ifndef ONLINE_JUDGE    freopen("in.txt","r",stdin);#endif    int n;    while(scanf(" %d",&n)!=EOF)    {        for(int i=0; i<n; i++)        {            scanf(" %lf %lf",&p[i].x,&p[i].y);        }        memset(map,0,sizeof(map));        for(int i=0; i<n; i++)        {            for(int j=0; j<n; j++)            {                map[i][j] = sqrt((p[i].x - p[j].x) * (p[i].x - p[j].x) + (p[i].y - p[j].y) * (p[i].y - p[j].y));            }        }        memset(dist,0x7f,sizeof(dist));        memset(visited,0,sizeof(visited));        dist[0] = 0;        double sum = 0;        for(int i=0; i<n; i++)        {            int k = 0;            double min = 100000;//this            for(int j=0; j<n; j++)            {                if(visited[j] == 0 && dist[j]<min)                {                    min = dist[j];                    k = j;                }            }            visited[k] = 1;            sum += min;            for(int j = 0; j<n; j++)            {                if(dist[j] > map[k][j])                {                    dist[j] = map[k][j];                }            }        }        printf("%.2lf\n",sum);    }    return 0;}