您的位置:首页 > 其它

HDU-1875-畅通工程再续-最小生成树

2014-08-06 10:47 274 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1875

题意:其实只要把那些小于10和大于1000的权值变成INF酒可以了

#include<cstdio>
#include<cmath>
#define INF 1000000000
const int N=201;
struct node
{
double x,y;
int i;
};
node f
;
double G

;
double low
;
void calc(const node &a,const node &b){
double dis=sqrt(pow(a.x-b.x,2)+pow(a.y-b.y,2));
if(dis<10 || dis>1000 ) dis=INF;
G[a.i][b.i]=G[b.i][a.i]=dis;
}
double prim(int n)
{
double ans=0,min;
bool vis
={0};
int pos=0,i,j;
for(int i=0;i<n;++i)
low[i]=G[0][i];
vis[pos]=true;
for(i=1;i<n;++i ){
for(j=0,min=low[j],pos=j;j<n;++j)if(!vis[j]){
if(low[j]<min){
min=low[j];
pos=j;
}
}
ans+=min;
vis[pos]=true;
for(j=0;j<n;++j){
if(!vis[j]&&low[j]>G[pos][j]){
low[j]=G[pos][j];
}
}
}
return ans;
}
int main()
{
int n,T;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(int i=0;i<n;++i){
scanf("%lf %lf",
&f[i].x,&f[i].y);
f[i].i=i;
}
for(int i=0;i<n;++i)
for(int j=0;j<n;++j)if(i==j)
G[i][j]=INF;

for(int j=0;j<n;++j)
for(int i=j+1;i<n;++i){
calc(f[j],f[i]);
}
double ans=prim(n);
if(ans>=INF)
puts("oh!");
else
printf("%.1lf\n",ans*100);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: