您的位置:首页 > 其它

hdu 1875 最小生成树(prim算法)…

2013-09-11 14:04 387 查看
2011ACM/ICPC亚洲区中国大陆5个赛区信息汇集[/b]


畅通工程再续

Time
Limit: 2000/1000 MS
(Java/Others)    Memory
Limit: 32768/32768 K (Java/Others)Total Submission(s):
4940    Accepted
Submission(s): 1443
Problem Description相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现。现在政府决定大力发展百岛湖,发展首先要解决的问题当然是交通问题,政府决定实现百岛湖的全畅通!经过考察小组RPRush对百岛湖的情况充分了解后,决定在符合条件的小岛间建上桥,所谓符合条件,就是2个小岛之间的距离不能小于10米,也不能大于1000米。当然,为了节省资金,只要求实现任意2个小岛之间有路通即可。其中桥的价格为
100元/米。 Input输入包括多组数据。输入首先包括一个整数T(T <= 200),代表有T组数据。每组数据首先是一个整数C(C <=
100),代表小岛的个数,接下来是C组坐标,代表每个小岛的坐标,这些坐标都是 0 <= x, y
<= 1000的整数。 Output每组输入数据输出一行,代表建桥的最小花费,结果保留一位小数。如果无法实现工程以达到全部畅通,输出”oh!”. Sample Input
2 2 
10
10 
20
20 3 
1

2

1000
1000 Sample Output
1414.2 oh!#include
<stdio.h>
#include<math.h>
#define MAX 10000000  
     
 
double a[501][501];
struct node
{
int x;
int y;
}point[100];
 double Prim(double graph[][501],
int n)//注意double型
{
  
 double k[501];  
     
     
     
   
  
 int flag, i, j;
double min,sum=0;
  
 for(i=1;i<=n;i++)
  
     k[i] =
graph[1][i];    
   
 
  
 for(i=2;i<=n;i++)
  
 {
  
     min=MAX;
     
     
   
  
     flag = 0;
     
     
     
     
 
  
   
 for(j=2;j<=n;j++)
     
     
   
  
   
 {
  
     
   if(k[j]<min
&& k[j] != 0)
  
     
   {
  
     
     
 min=k[j];    
   
  
     
     
 flag = j;    
     
   
 
  
     
   }
  
   
 }
  
   
if(min==MAX)//判断是否能够所有的岛都能连起来
  
     
  return -1; 
  sum+=min;
  
     k[flag] =
0;      
     
 
  
     for(j = 2;
j <= n; j++)    
     
   
  
   
 {
  
     
   if(graph[flag][j]
< k[j])    
 
  
     
   {
  
     
     
 k[j] = graph[flag][j];
  
     
   }
  
   
 }
  
 }
  
 return sum;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int c;
int i,j;
scanf("%d",&c);
for(i=1;i<=c;i++){
scanf("%d%d",&point[i].x,&point[i].y);
a[i][i]=0;
for(j=1;j<i;j++)//应为没给出之间的距离所以要先求出个岛之间的距离,再用Prim
{   
  double d;
d=sqrt((point[i].y-point[j].y)*(point[i].y-point[j].y)+(point[i].x-point[j].x)*(point[i].x-point[j].x))*100;//这个地方不太好处理,好好琢磨一下
if(d<1000||d>100000)
d=MAX;
a[i][j]=a[j][i]=d;
}
}
double k=Prim(a,c);
if (k==-1)
  
     
   printf ("oh!\n");
  
   
 else
  
     
   printf ("%.1lf\n",
k);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐