• [HAOI2006]l旅行


    这道题。。。一眼看出一个暴力思虑。。。那就是按照生成树。。。

    排完序之后从当前边开始向后做生成树。。。

    统计一下答案就好了。。。

    结果。。。这就是正解。。。QVQ。。。smg。。。我去。。。

    呆码:

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #define INF 99999999
    #define MAXN 1010
    #define unionn(x,y) fa[y]=x
    #define eps 0.000001
    using namespace std;
    
    int fa[MAXN],n,m,s,t,maxn,minx,ll=INF,rr=INF;
    double ans=999999;
    
    struct asd{
        int x,y,v;
    } r[20010];
    
    inline int find(int x)
    {
        if(fa[x]!=x) fa[x]=find(fa[x]);
        return fa[x];
    }
    
    inline bool cmp(asd x,asd y)
    {
        return x.v<y.v;
    }
    
    inline int gcd(int a,int b)
    {
        return b==0 ? a : gcd(b,a%b);
    }
    
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++)
            scanf("%d%d%d",&r[i].x,&r[i].y,&r[i].v);
        scanf("%d%d",&s,&t);
        sort(r+1,r+1+m,cmp);
    
        for(int i=1;i<=m;i++)
        {
            for(int j=1;j<=n;j++) fa[j]=j;
            unionn(find(r[i].x),find(r[i].y));
            minx=maxn=r[i].v;
            if(find(s)==find(t))
            {
                double anss=ans;
                ans=(double)maxn/minx;
                if(ans-eps<anss-eps)
                    ll=maxn,rr=minx;
                break;
            }
            for(int j=i+1;j<=m;j++)
                if(find(r[j].x)!=find(r[j].y))
                {
                    unionn(find(r[j].x),find(r[j].y));
                    minx=min(minx,r[j].v);
                    maxn=max(maxn,r[j].v);
                    if(find(s)==find(t))
                    {
                        double anss=ans;
                        ans=(double)maxn/minx;
                        if(ans-eps<anss-eps)
                            ll=maxn,rr=minx;
                        else ans=anss;
                        break;
                    }
                }
        }
        if(ll==INF) { printf("IMPOSSIBLE
    "); return 0;}
        if((double)ll/rr==ll/rr) printf("%d",ll/rr);
        else
        {
            while(gcd(rr,ll)!=1)
            {
                int mid=gcd(rr,ll);
                ll/=mid; rr/=mid;
            }
            printf("%d/%d
    ",ll,rr);
        }
    }
    代码

    不过细节比较多。。。要注意。。。

  • 相关阅读:
    微博个人中心效果
    微博弹性按钮
    ios9 3dtouch 博客
    去掉导航栏阴影
    模态全屏模式,实现半透明效果
    剪切图片
    修改push动画的方向
    数据库链接池终于搞对了,直接从100ms到3ms
    如何在Java代码中去掉烦人的“!=null”
    面试官:请讲下接口具体怎么优化!
  • 原文地址:https://www.cnblogs.com/zzzyc/p/9115271.html
Copyright © 2020-2023  润新知