Codevs 1001 舒适的路线

题目描述 Description
Z小镇是一个景色宜人的地方,吸引来自各地的观光客来此旅游观光。
Z小镇附近共有
N(1

#include
#include
using namespace std;
struct bcj{
    int fat[501];
    void build(int n){for(int i=1;i<=n;++i)fat[i]=i;}
    int find(int x){if(x==fat[x])return x;else return fat[x]=find(fat[x]);}
    void merge(int x,int y){
        x=find(x);y=find(y);
        if(x==y)return;
        else fat[x]=fat[y];
    }
    bool judge(int x,int y){return find(x)==find(y);}
}a;
int n,m,start,goal;
struct way{
    int f,t,v;
    bool operator<(const way &b)const{
        return v5001];
int gcd(int a,int b){if(b==0) return a;return gcd(b,a%b);}
int main(){
    scanf("%d%d",&n,&m);
    a.build(n);
    for(int i=1;i<=m;++i){
        scanf("%d%d%d",&p[i].f,&p[i].t,&p[i].v);
        a.merge(p[i].f,p[i].t);
    }
    scanf("%d%d",&start,&goal);
    if(!a.judge(start,goal)){
        printf("IMPOSSIBLE");
        return 0;
    }
    sort(p+1,p+m+1);
    double ans=10e7,fmax,fmin;
    int ansmax,ansmin;
    for(int i=1;i<=m;++i){
        a.build(n);
        fmax=p[i].v;
        for(int j=i;j>=1;--j){
            fmin=p[j].v;
            a.merge(p[j].f,p[j].t);
            if(a.judge(start,goal)){
                if(ans>fmax/fmin){
                    ansmin=fmin;
                    ansmax=fmax;
                    ans=fmax/fmin;
                }
                break;
            }
        }
    }
    if(ansmax%ansmin){
        int t=gcd(ansmax,ansmin);
        ansmax/=t;ansmin/=t;
        printf("%d/%d",ansmax,ansmin);
    }
    else printf("%d",ansmax/ansmin);
    return 0;
}

你可能感兴趣的:(并查集)