题目描述 Description
Z小镇是一个景色宜人的地方,吸引来自各地的观光客来此旅游观光。
Z小镇附近共有
N(1
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <set>
#include <vector>
#define INF 0xffffff
using namespace std;
const int maxn=10000+10;
struct node{
int x,y,v;
}edge[maxn];
int fa[maxn];
int find(int x)
{
return x==fa[x]?x:fa[x]=find(fa[x]);
}
bool cmp(node a,node b)
{
return a.v<b.v;
}
int gcd(int a, int b)
{
return b?gcd(b,a%b):a;
}
int main()
{
int n,m,s,t;
int maxd,mind;
cin>>n>>m;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&edge[i].x,&edge[i].y,&edge[i].v);
}
scanf("%d%d",&s,&t);
sort(edge+1,edge+m+1,cmp);//按v值从小到大排序
double ans=INF;
for(int i=1;i<=m;i++)//把最小速度不断上升,i之前的道路切断不用
{
for(int j=1;j<=n;j++)
fa[j]=j;
for(int j=i;j<=m;j++)//找最大速度
{
if(find(edge[j].x)!=find(edge[j].y))//如果不在一个集合里面,因为这两个点之间有道路就合并
fa[fa[edge[j].x]]=fa[edge[j].y];
if(find(s)==find(t))
{
if(edge[j].v/1.0/edge[i].v<ans)//最小比值
{
ans=edge[j].v/1.0/edge[i].v;
maxd=edge[j].v;
mind=edge[i].v;
}
break;
}
}
}
if(ans == INF)
printf("IMPOSSIBLE\n");
else {//求最大公因数并约分
int temp = gcd(maxd, mind);
maxd /= temp;
mind /= temp;
printf("%d",maxd);
if(mind!= 1)
printf("/%d",mind);
printf("\n");
}
return 0;
}