您的位置:首页 > 其它

hdu1162(最小生成树prim)

2014-03-13 21:08 211 查看
题目链接:hdu1162

n个点的坐标,将这些点连起来,求最短距离。

prim水过.....

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <cstdlib>
#include <queue>
using namespace std;
const int N = 105;
double map

;
bool use
;
double lowcost
;
struct node
{
double x,y;
}s[105];

double prim(int v)
{
int i,j;
double sum = 0;
for(i = 1; i <= v; i ++)
lowcost[i] = map[1][i], use[i] = false;
use[1] = true;

for(i = 2; i <= v; i ++)
{
double minn = 1e9;
int pos;
for(j = 1; j <= v; j ++)
if(!use[j] && lowcost[j] < minn)
{
minn = lowcost[j];
pos = j;
}
sum += minn;
use[pos] = true;
for(j = 1; j <= v; j ++)
if(!use[j] && map[pos][j] < lowcost[j])
lowcost[j] = map[pos][j];
}
return sum;
}
int main()
{
int n,i,j;
while(~scanf("%d",&n))
{
for(i = 1; i <= n; i ++)
scanf("%lf%lf",&s[i].x,&s[i].y);

for(i = 1; i <= n; i ++)
for(j = 1; j <= n; j ++)
if(i != j)
map[i][j] = sqrt((s[i].x-s[j].x)*(s[i].x-s[j].x)+(s[i].y-s[j].y)*(s[i].y-s[j].y));
else
map[i][j] = 1e8;
printf("%.2lf\n",prim(n));
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  最小生成树