• hdu 4463 Outlets 解题报告


    题意:给定你二维平面内的n个点,有两个点之间必须建路,问你所有点连接起来的最短路径是多少

    解题思路:裸的最小生成树,不过在实现最小生成树之前,应该初始它的并查集和临时最短路径长度

    解题代码:

    #include<stdio.h>
    #include<string.h>
    #include<math.h>
    #include<algorithm>
    #include<iostream>
    #define max(a , b) (a)>(b)?(a):(b)
    #define min(a , b) (a)<(b)?(a):(b)
    #define LL long long
    using namespace std;
    
    int v[500000];
    int u[500000];
    double w[500000];
    int p[100];
    int r[500000];
    struct point
    {
       int   x , y;
    }points[60];
    double dis(int i , int j )
    {
        return  sqrt(pow(points[i].x-points[j].x,2) + pow(points[i].y-points[j].y,2));
    }
    int find(int x) 
    {
       return  p[x] == x? x: p[x] = find(p[x]);
    }
    double cmp(const int i , const int j)
    {
        return w[i] < w[j];
    }
    int main()
    {
         int n;
        //freopen("/home/plac/problem/input.txt","r",stdin);
    
         while(scanf("%d",&n) != EOF)
         {
             memset(p,0,sizeof(p));
             memset(r,0,sizeof(r));    
             memset(v,0,sizeof(v));
             memset(w,0,sizeof(w));
             memset(u,0,sizeof(u));
             memset(points,0,sizeof(points));
             if(n == 0 )
                break;
             int a, b ; 
             scanf("%d %d",&a,&b);
             for(int i = 1;i <= n;i ++)        
             {
                 scanf("%d %d",&points[i].x,&points[i].y);        
             }
             int k = 0;
             for(int i  = 1;i <= n;i ++)
              for(int j  = i+1;j <= n; j++)
             {
                 v[k] = i ;
                 u[k] = j ;
                 w[k] = dis(i,j);
                // printf("%lf\n",w[k]);
                 k ++;  
             }
             for(int i = 1;i <=  n;i ++) p[i] = i ; 
             for(int i = 0;i <= k ; i++) r[i]  = i ;
             sort(r,r+k,cmp);
             p[b] = a;
             double ans = dis(a,b);
             
             for(int i = 0 ;i < k ;i ++)
             {
                 int e = r[i];
                 int x  = find(v[e]);
                 int y = find(u[e]);
                 if(x != y)
                 {
                    ans += w[e];
                    p[x] = y;
                 }
             }          
             printf("%.2f\n",ans);
         }
        return 0 ;
    }
    View Code

     因为r数组开小了 ,导致溢出,,WA

    没有梦想,何谈远方
  • 相关阅读:
    2020软件工程作业01
    2020软件工程个人作业06——软件工程实践总结作业
    2020软件工程作业05
    2020软件工程作业04
    2020软件工程作业03
    2020软件工程02




  • 原文地址:https://www.cnblogs.com/zyue/p/3111772.html
Copyright © 2020-2023  润新知