您的位置:首页 > 其它

hdu 1865 畅通工程再续

2013-11-15 10:18 204 查看
最小生成树,用Prim算法。

#include <iostream>
#include<stdio.h>
#include<cstring>
#include<queue>
#include<math.h>
using namespace std;
const double INF=100000000.0;
int visit[110];
double d[110],w[110][110];
struct
{
int x,y;
} re[110];

int main()
{
int n,cas,r,i,j,ok=0;
double min;  //之前写成int了,wa了我一晚上,想哭啊~~~~
scanf("%d",&cas);
while(cas--)
{
scanf("%d",&n);
//if(m==0)  break;
double ans=0.0;
memset(visit,0,sizeof(visit));
for(i=1; i<=n; i++)
{
d[i]=(i==1?0:INF);
for(j=1; j<=n; j++)
{
if(i==j)w[i][j]=0;
else w[i][j]=INF;
}
}
for(i=1; i<=n; i++)
{

scanf("%d %d",&re[i].x,&re[i].y);
}
if(n==1) ok=1;
for(i=1; i<=n; i++)
for(j=i+1; j<=n; j++)
{
//      printf("aaa%lf\n",(re[i].x-re[j].x)*(re[i].x-re[j].x));
double xx=re[i].x-re[j].x;
double yy=re[i].y-re[j].y;
double dis=sqrt(xx*xx+yy*yy);
if(dis<10.000000||dis>1000.000000)
w[i][j]=w[j][i]=INF;
else  w[i][j]=w[j][i]=dis;
}
queue<int>q;
q.push(1);
int count=1;
visit[1]=1;
while(count<n)
{
//  printf("count %d\n",count);
min=INF;
ok=0;
int temp=q.front();
q.pop();
for(i=1; i<=n; i++)
{
if(visit[i]==0)
{
if(d[i]>w[temp][i])
d[i]=w[temp][i];
if(d[i]<min)
{
ok=1;
min=d[i];
r=i;
}
}
}
if(ok==1)  //说明有一条路小于INF
{
visit[r]=1;
q.push(r);
count++;
ans+=d[r];
}
else break;

}
if(ok==1)printf("%.1lf\n",ans*100);
else printf("oh!\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: