codevs1001 舒适的路线

来源:互联网 发布:网络流行语解释大全 编辑:程序博客网 时间:2024/04/28 16:47

并查集
按边长从小到大排序
http://blog.csdn.net/zhuml123/article/details/51722485

很巧妙的想法

#include<stdio.h>#include<iostream>#include<algorithm>using namespace std;int n,m;int s,t;struct edd{    int x;    int y;    int z;}edge[5003];int cmp(edd a,edd b){    return a.z<b.z;}int fa[502];int find(int a){    if(fa[a]!=a){fa[a]=find(fa[a]);}    return fa[a];}int unnion(int a,int b){    a=find(a);    b=find(b);    if(a!=b) fa[a]=b;}int gcd(int  a,int b){    if(b==0) return a;    return gcd(b,a%b);}int main(){    scanf("%d%d",&n,&m);    int i,j;    for(i=1;i<=m;i++)    {        scanf("%d%d%d",&edge[i].x,&edge[i].y,&edge[i].z);    }    scanf("%d%d",&s,&t);    int l=0,r=0;    int ansl=0,ansr=0,ttt=0;    sort(edge+1,edge+m+1,cmp);    while(1)    {    for(i=1;i<=n;i++) fa[i]=i;    for(i=l+1;i<=m;i++)    {        unnion(edge[i].x,edge[i].y);        if(find(s)==find(t))        {            r=i;            break;        }    }    if(find(s)!=find(t)) break;    for(i=1;i<=n;i++) fa[i]=i;    for(i=r;i>=1;i--)    {        unnion(edge[i].x,edge[i].y);        if(find(s)==find(t))        {            l=i;            break;          }    }    if(ttt==0||edge[r].z*edge[ansl].z<=edge[l].z*edge[ansr].z)    {        ttt++;        ansl=l;        ansr=r;    }    }    if(ansr==0&&ansl==0) printf("IMPOSSIBLE");    else if(edge[ansr].z%edge[ansl].z==0)printf("%d",edge[ansr].z/edge[ansl].z);    else    {        int k=gcd(edge[ansr].z,edge[ansl].z);        int x=edge[ansr].z/k;        int y=edge[ansl].z/k;        printf("%d/%d",x,y);    }    return 0;}
0 0
原创粉丝点击