zoukankan      html  css  js  c++  java
  • 畅通工程再续(最小生成树)

    这道题被坑的难受,很基础的题目,但是还是wa的郁闷,主要的错误是不懂的分析,导致变量的定义出错,记录k点的最短边要double的却依旧写int导致wa的找不出错了

    #include<stdio.h>
    #include<math.h>
    #include<string.h>
    
    const int MAXN=1100;
    const int INF=0x7fffffff;
    
    struct Node
    {
        int x,y;
    } node[MAXN*2];
    
    double map[MAXN][MAXN];
    int n,flag;
    double ans;
    int pre[MAXN];
    double dist[MAXN];
    
    double _dist(Node a,Node b)
    {
        return sqrt((1.0*(a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)));
    }
    
    void Prim()
    {
        int i,j,k;
        double mn;
        bool p[MAXN];
        for(i=1; i<=n; i++)
        {
            p[i]=false;
            dist[i]=map[1][i];
            pre[i]=1;
        }
        p[1]=true;
        ans=0;
        for(i=1; i<=n-1; i++)
        {
            mn=INF;
            k=0;
            for(j=1; j<=n; j++)
            {
                if(!p[j] && dist[j]<mn)
                {
                    mn=dist[j];
                    k=j;
                }
            }
            p[k]=true;
            ans+=dist[k];
            if(k==0)
            {
                flag=1;
                return ;
            }
    
            for(j=1; j<=n; j++)
            {
                if(!p[j] && map[k][j]!=INF  && dist[j]>map[k][j])
                {
                    dist[j]=map[k][j];
                    pre[j]=k;
                }
            }
        }
    }
    
    int main()
    {
        int T,i,j;
        scanf("%d",&T);
        while(T--)
        {
            scanf("%d",&n);
            for(i=1; i<=n; i++)
                scanf("%d%d",&node[i].x,&node[i].y);
            for(i=1; i<=n; i++)
            {
                for(j=1; j<=n; j++)
                {
                    map[i][j]=_dist(node[i],node[j]);
                    if(map[i][j]>1000 || map[i][j]<10) map[i][j]=INF;
                    if(i==j) map[i][j]=0;
                }
            }
            ans=flag=0;
            Prim();
            if(flag) printf("oh!\n");
            else printf("%.1lf\n",ans*100.0);
        }
        return 0;
    }
  • 相关阅读:
    [LUOGU] P2196 挖地雷
    [LUOGU] P1020 导弹拦截
    [LUOGU] P2543 [AHOI2004]奇怪的字符串
    [LUOGU] P2759 奇怪的函数
    [LUOGU] P1048 采药
    [LUOGU] P1396 营救
    [LUOGU] P1196 [NOI2002]银河英雄传说
    [LUOGU] 2820 局域网
    知识点
    swich使用
  • 原文地址:https://www.cnblogs.com/zsboy/p/2627774.html
Copyright © 2011-2022 走看看