• HDU 4081 Qin Shi Huang's National Road System


    最小生成树+枚举+DFS

    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<vector>
    #include<algorithm>
    using namespace std;
    
    const double INF=0x7FFFFFFF;
    const int maxn=1000+10;
    int T,n,tot;
    double cost,Max1,Max2,ans;
    struct Point
    {
        double x,y;
        double val;
    }p[maxn];
    struct Edge
    {
        int u,v;
        double dis;
    }e[maxn*maxn];
    int Father[maxn];
    vector<int>Tree[maxn];
    int flag[maxn*maxn];
    int x[maxn];
    
    bool cmp(const Edge&a,const Edge&b)
    {
        return a.dis<b.dis;
    }
    
    void init()
    {
        tot=0;cost=0;ans=-INF;
        memset(flag,0,sizeof flag);
        for(int i=0;i<=n;i++) Father[i]=i;
        for(int i=0;i<=n;i++) Tree[i].clear();
    }
    
    int Find(int x)
    {
        if(x!=Father[x]) Father[x]=Find(Father[x]);
        return Father[x];
    }
    
    double Dis(int a,int b)
    {
        return sqrt((p[a].x-p[b].x)*(p[a].x-p[b].x)+(p[a].y-p[b].y)*(p[a].y-p[b].y));
    }
    
    void dfs1(int now)
    {
        x[now]=1;
        if(p[now].val>Max1) Max1=p[now].val;
        for(int i=0;i<Tree[now].size();i++)
        {
            int id=Tree[now][i];
            if(flag[id]==1)
            {
                if(e[id].u==now&&x[e[id].v]==0) dfs1(e[id].v);
                else if(e[id].v==now&&x[e[id].u]==0) 
                    dfs1(e[id].u);
            }
        }
    }
    
    void dfs2(int now)
    {
        x[now]=1;
        if(p[now].val>Max2) Max2=p[now].val;
        for(int i=0;i<Tree[now].size();i++)
        {
            int id=Tree[now][i];
            if(flag[id]==1)
            {
                if(e[id].u==now&&x[e[id].v]==0) dfs2(e[id].v);
                else if(e[id].v==now&&x[e[id].u]==0) 
                    dfs2(e[id].u);
            }
        }
    }
    
    int main()
    {
        scanf("%d",&T);
        while(T--)
        {
            scanf("%d",&n);
            init();
            for(int i=1;i<=n;i++)
                scanf("%lf%lf%lf",&p[i].x,&p[i].y,&p[i].val);
    
            for(int i=1;i<=n;i++)
            {
                for(int j=i+1;j<=n;j++)
                {
                    e[tot].u=i;
                    e[tot].v=j;
                    e[tot].dis=Dis(i,j);
                    tot++;
                }
            }
    
            sort(e,e+tot,cmp);
    
            for(int i=0;i<tot;i++)
            {
                int fx=Find(e[i].u);
                int fy=Find(e[i].v);
                if(fx!=fy)
                {
                    Father[fx]=fy;
                    cost=cost+e[i].dis;
                    Tree[e[i].u].push_back(i);
                    Tree[e[i].v].push_back(i);
                    flag[i]=1;
                }
            }
    
            for(int i=0;i<tot;i++)
            {
                if(flag[i])
                {
                    memset(x,0,sizeof x);
                    flag[i]=0;
                    Max1=-INF;
                    Max2=-INF;
                    dfs1(1);
                    for(int i=1;i<=n;i++)
                        if(!x[i])
                        {
                            dfs2(i);
                            break;
                        }
                    if((1.0*Max1+1.0*Max2)/(cost-e[i].dis)>ans)
                        ans=(1.0*Max1+1.0*Max2)/(cost-e[i].dis);
                    flag[i]=1;
                }
            }
            printf("%.2lf
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    linux常用命令(持续更新)
    nginx和redis
    网络编程BIO、NIO、AIO
    同步和异步、阻塞和非阻塞
    执行一条sql语句过程
    InnoDB 的B+树索引原理
    InnoDB 为啥要选择B+树来存储数据
    MySQL数据库引擎简介
    java并发编程(同步、同步容器、线程池)
    putty登录linux遭refuse
  • 原文地址:https://www.cnblogs.com/zufezzt/p/4954004.html
Copyright © 2020-2023  润新知