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;
}
原文地址:https://www.cnblogs.com/zufezzt/p/4954004.html