最小生成树hdu1875再续畅通工程

来源:互联网 发布:网络打字员怎么做 编辑:程序博客网 时间:2024/06/05 12:47

Problem N

Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 47   Accepted Submission(s) : 20

Font: Times New Roman | Verdana | Georgia

Font Size:

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

2210 1020 2031 12 21000 1000

Sample Output

1414.2

#include<stdio.h>
#include<math.h>
#include<string.h>
#define max 9999999
double map[110][110],lowcost[110];
int n;
int visit[110];

struct point
{
  double x,y;
}p[210];

 

int main()
{
    int i,j,k,t;
    double temp,x1,y1,min;
    scanf("%d",&t);
    while(t--)
    {
        memset(map,0,sizeof(map));               
        memset(visit,0,sizeof(visit));
        memset(lowcost,0,sizeof(lowcost));
        int flag=1;
        scanf("%d",&n);
        for(i=1;i<=n;i++)
         scanf("%lf %lf",&p[i].x,&p[i].y);
        for(i=1;i<n;i++)
            for(j=1;j<=n;j++)
        {
       
          x1=(p[i].x-p[j].x)*(p[i].x-p[j].x);
          y1=(p[i].y-p[j].y)*(p[i].y-p[j].y);
          temp=sqrt(x1+y1);
       
            if(temp<10||temp>1000)
            map[i][j]=map[j][i]=max;
            else map[i][j]=map[j][i]=temp;
        }
        
        double sum=0.0;
         visit[1]=1;
        for(i=1;i<=n;i++)
        lowcost[i]=map[1][i];
        for(i=2;i<=n;i++)
        {
            min=max;
            for(j=1;j<=n;j++)
           {
            if(!visit[j]&&lowcost[j]<min)
              k=j;
              min=lowcost[j];
           }
           if(min>=max||min<10)
           {
            flag=0;
            break;   
           }
           visit[k]=1;
           sum+=min;
           for(j=1;j<=n;j++)
           {
            if(!visit[j]&&lowcost[j]>map[k][j])
            lowcost[j]=map[k][j];
           }
        }
        if(flag==1)
         printf("%.1lf\n",sum*100.0);
        else
        printf("oh!\n");
       
    }   
   return 0;
}   
  这段代码不知道怎么哪里不对,求指教。。。。

下面贴ac代码:

    #include<stdlib.h>
#include<string.h>
#include<stdio.h>
#include<math.h>
struct point
{
    double x,y;
};
point a[111];
double cost[111][111],maxn;
int  t,n;
/*double jisuan(point aa,point bb)
//{
    double ss;
    ss=sqrt(pow(aa.x-bb.x,2.0)+pow(aa.y-bb.y,2.0));
    return ss;
//}*/
/*void prim()
{
    double lowcost[n],min,mincost=0.0;
    long i,k,j;
    bool bo[n];
    for (i=1;i<=n;i++)
    {
        bo[i]=false;
        lowcost[i]=cost[1][i];
    }
    bo[1]=true;
    for (i=2;i<=n;i++)
    {
        min=maxn;
        for (j=1;j<=n;j++)
          if (!bo[j] && lowcost[j]<min)
          {
                min=lowcost[j];
                k=j;
            }
        if (min>=maxn || min<10.0)
        {
            k=1;
            break;
        }
        bo[k]=true;
        mincost+=min;
        for (j=1;j<=n;j++)
          if (!bo[j] && lowcost[j]>cost[k][j])
            lowcost[j]=cost[k][j];
    }
    if (k!=1) printf("%0.1lf\n",mincost*100);
    else printf("oh!\n");
}*/
int main()
{
    scanf("%d",&t);
    maxn=3000.0;
    for (int k=1;k<=t;k++)
    {
        scanf("%d",&n);
        for (int i=1;i<=n;i++)
        {
           
       
          for (int j=1;j<=n;j++)
           {
             
         
            if (i==j) cost[i][j]=0.0;
            else cost[i][j]=maxn;
           }
        }
        for (int i=1;i<=n;i++)
        {
            scanf("%lf%lf",&a[i].x,&a[i].y);
        }
       
        double s;
        for (int i=1;i<=n-1;i++)
          for (int j=i+1;j<=n;j++)
          {
                //s=jisuan(a[i],a[j]);
               // double ss;
                 s=sqrt(pow(a[i].x-a[j].x,2.0)+pow(a[i].y-a[j].y,2.0));
                // return ss;
                if (s<10.0 || s>1000.0) cost[i][j]=cost[j][i]=maxn;
                else cost[i][j]=cost[j][i]=s;
            }
        //prim();
    double lowcost[n],min,sum=0.0;
    int  i,k,j;
    bool bo[n];
    for (i=1;i<=n;i++)
    {
        bo[i]=false;
        lowcost[i]=cost[1][i];
    }
    bo[1]=true;
    for (i=2;i<=n;i++)
    {
        min=maxn;
        for (j=1;j<=n;j++)
          if (!bo[j] && lowcost[j]<min)
          {
                min=lowcost[j];
                k=j;
            }
        if (min>=maxn || min<10.0)
        {
            k=1;
            break;
        }
        bo[k]=true;
        sum+=min;
        for (j=1;j<=n;j++)
          if (!bo[j] && lowcost[j]>cost[k][j])
            lowcost[j]=cost[k][j];
    }
    if (k!=1) printf("%0.1lf\n",sum*100);
    else printf("oh!\n");
    }
    return 0;
}