2 条题解

  • 0
    @ 2025-10-8 17:02:28
    #include<bits/stdc++.h>
    using namespace std;
    const int N=510;
    const int M=5100;
    struct edge{int x,y,w,pre;}a[M*2];int alen,last[N];
    void add(int x,int y,int w){alen++;a[alen]=edge{x,y,w,last[x]};last[x]=alen;}
    int n,m,fa[N];
    int findfa(int x){return fa[x]==x? x : fa[x]=findfa(fa[x]);}
    bool cmp(edge &a,edge &b){return a.w>b.w;}
    int main()
    {
        int n,m;scanf("%d%d",&n,&m);
        alen=0;memset(last,0,sizeof(last));
        for(int i=1;i<=n;i++) fa[i]=i;
        for(int i=1,x,y,w;i<=m;i++)
        {
            scanf("%d%d%d",&x,&y,&w);
            add(x,y,w);
            fa[findfa(x)]=findfa(y);
        } 
        int st,ed;scanf("%d%d",&st,&ed);
        if(findfa(st)!=findfa(ed)){puts("IMPOSSIBLE");return 0;}
        sort(a+1,a+1+alen,cmp);
        double ans=1e10;
        int mx,mi;
        for(int i=1;i<=m;i++)
        {
            for(int k=1;k<=n;k++) fa[k]=k;
            
            for(int j=i;j<=m;j++)
            {
                int x=a[j].x,y=a[j].y;
                fa[findfa(x)]=findfa(y);
                if(findfa(st)==findfa(ed))
                {
                    double tmp=(1.0*a[i].w)/(1.0*a[j].w);
                    if(tmp<ans) mx=a[i].w,mi=a[j].w,ans=tmp;
                    break;
                }
            }
        } 
        if(mx/mi*mi==mx)printf("%d\n",mx/mi);
        else printf("%d/%d\n",mx/__gcd(mx,mi),mi/__gcd(mx,mi));
        return 0;
    }
    
    • 1

    信息

    ID
    2703
    时间
    1000ms
    内存
    125MiB
    难度
    5
    标签
    递交数
    35
    已通过
    16
    上传者