畅通工程再续---hdu1875

http://acm.hdu.edu.cn/showproblem.php?pid=1875

把已知的坐标转化为点与点的距离保存到maps里;

#include<stdio.h>
#include<string.h>
#include<map>
#include<iostream>
#include<algorithm>
#include<math.h>
#define N 110
#define INF 0xfffffff

using namespace std;

int  vis[N], n;
double maps[N][N],dist[N];

struct node
{
    int x,y;
}a[N];

void Init()
{
    for(int i=0; i<=n; i++)
    {
        vis[i] = 0;
        dist[i] = INF;
        for(int j=0; j<=n; j++)
        {
            maps[i][j] = INF;
        }
    }
    memset(a,0,sizeof(a));
}

double Prim(int start)
{
    double ans = 0;
    for(int i=1; i<=n; i++)
        dist[i] = maps[start][i];
    vis[start] = 1;
    for(int i=1; i<n; i++)
    {
        double Min = INF;
        int index = -1;
        for(int j=1; j<=n; j++)
        {
            if(vis[j]==0 && Min > dist[j])
                Min = dist[j], index = j;
        }
        if(index == -1) break;
        vis[index] = 1;
        ans += Min;
        for(int j=1; j<=n; j++)
        {
            if(vis[j]==0 && dist[j] > maps[index][j])
            {
                dist[j] = maps[index][j];
            }
        }
    }
    return ans;
}

int main()
{
    int i, j,  T;
    double ans;
    scanf("%d", &T);
    while(T--)
    {
        scanf("%d", &n);
        Init();
        for(i=1; i<=n; i++)
            scanf("%d%d", &a[i].x, &a[i].y);
        for(i=1; i<=n; i++)
        {
            for( j=1; j<i; j++)
            {
                int d=(a[i].x-a[j].x)*(a[i].x-a[j].x)+(a[i].y-a[j].y)*(a[i].y-a[j].y);
                if(d>=100 && d<=1000000)
                    maps[i][j] = maps[j][i] = sqrt(d);
            }
        }
        ans = Prim(1);
        if(ans == 0)
            printf("oh!
");
        else
            printf("%.1lf
", ans*100);
    }
    return 0;
}