zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    关于返回上一页功能
    Mybatis Update statement Date null
    SQLite reset password
    Bootstrap Validator使用特性,动态(Dynamic)添加的input的验证问题
    Eclipse使用Maven2的一次环境清理记录
    Server Tomcat v7.0 Server at localhost failed to start
    PowerShell一例
    Server Tomcat v7.0 Server at libra failed to start
    商标注册英语
    A glance for agile method
  • 原文地址:https://www.cnblogs.com/zufezzt/p/4954004.html
Copyright © 2011-2022 走看看