您的位置:首页 > 其它

poj 2349 Arctic Network mst(最小…

2013-04-14 19:36 387 查看
s个卫星可以把s个连通分量给连接起来

所以题目变成把图构成s个联通量的最长边的最小值

考虑最小生成树的性质

最小生成树的边的第k大边也是所有生成树中最小的

所以答案就是求成最小生成树,然后输出第n-s条边

#include <iostream>

#include<stdio.h>

#include<string.h>

#include<math.h>

double d[501][501];

struct

{

int
x,y;

}a[501];

using namespace std;

double cal(int t,int s)

{

double
tmp=a[t].x-a[s].x;

double
txt=a[t].y-a[s].y;

tmp*=tmp;

txt*=txt;

return(sqrt(tmp+txt));

}

int min(double key[],int n)

{

double
ret=999999;

int
tmp;

for(int
i=1;i<=n;i++)

if(key[i]!=-1&&key[i]<ret)

{

ret=key[i];

tmp=i;

}

return(tmp);

}

double prim(int n,int s)

{

double
key[501],ans=0;

int
from[501];

for(int
i=1;i<=n;i++)

{

key[i]=d[1][i];

from[i]=1;

}

key[1]=-1;

for(int
k=2;k<=n;k++)

{

int u=min(key,n);

key[u]=-1;

for(int i=1;i<=n;i++)

if(key[i]>d[u][i])

{

key[i]=d[u][i];

from[i]=u;

}

}

key[1]=0;

for(int
i=2;i<=n;i++)

key[i]=d[from[i]][i];

for(int
i=n;i>=1;i--)

for(int
j=1;j<i;j++)

{

if(key[j]>key[j+1])

{

double tmp=key[j];

key[j]=key[j+1];

key[j+1]=tmp;

}

}

// for(int
i=1;i<=n;i++)

// printf("%f
",key[i]);

ans=key[n-s+1];

return(ans);

}

int main()

{

int
time;

scanf("%d",&time);

while(time--)

{

int s,n;

scanf("%d %d",&s,&n);

for(int i=1;i<=n;i++)

scanf("%d %d",&a[i].x,&a[i].y);

for(int i=1;i<=n;i++)

for(int j=1;j<=n;j++)

d[i][j]=cal(i,j);

double ans=prim(n,s);

printf("%.2f\n",ans);

}

return
0;

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