最小生成树。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;
}