您的位置:首页 > 其它

codevs1001 舒适的路线

2016-11-04 15:08 218 查看
并查集

按边长从小到大排序

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  codevs 并查集