您的位置:首页 > 其它

uva 10397【Connect the Campus】

2012-04-16 13:02 295 查看
Krustral 变形。。。。。。

代码如下:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>

struct distance
{
int u,v;
double w;
}d[1000000];

struct point
{
int x,y;
}p[1000];

int f[1000];
int n;
int num;

bool cmp(const distance& a,const distance& b)
{
if(a.w == b.w)
return a.u < b.u;
return a.w < b.w;
}

double dis(point a,point b)
{
return sqrt(1.0*(a.x - b.x) * (a.x - b.x) + 1.0 * (a.y - b.y) * (a.y - b.y));
}

int find(int x)
{
if(x == f[x])
return x;
f[x] = find(f[x]);
return f[x];
}

void Krustral()
{
double sum = 0;
int k = 0;
for(int i = 0;i < num;i ++)
{
int fa = find(d[i].u);
int fb = find(d[i].v);
if(fa != fb)
{
f[fa] = fb;
sum += d[i].w;
k ++;
}
if(k == n -1)
break;
}

printf("%.2lf\n",sum);
}

int main()
{
while(scanf("%d",&n) == 1)
{
num = 0;
for(int i = 1;i <= n;i ++)
{
scanf("%d%d",&p[i].x,&p[i].y);
for(int j = 1;j < i;j ++)
{
d[num].u = i;
d[num].v = j;

d[num ++].w = dis(p[i],p[j]);
}
}

std::sort(d,d + num,cmp);
for(int i = 0;i <= n;i ++)
{
f[i] =i;
}
int on;
scanf("%d",&on);
for(int i = 0;i < on;i ++)
{
int a,b;
scanf("%d%d",&a,&b);
f[find(a)] = find(b);
}

Krustral();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: