#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct edgee
{
int from, to ;
double value;
}edge[5001];
bool com(edgee a, edgee b)
{
return a.value < b.value;
}
int fa[501];
int n, m,s,t;
int realmax, realmin;
void init()
{
for (int i = 1; i <= n; i++)
{
fa[i] = i;
}
}
int find(int x)
{
if (fa[x] == x)
return x;
else
{
return fa[x] = find(fa[x]);
}
}
void unionn(int x, int y)
{
x = find(x);
y = find(y);
if (x == y)
return;
fa[y] = x;
}
bool issame(int x, int y)
{
return find(x) == find(y);
}
int extgcd(int x, int y)
{
if (x < y)
swap(x, y);
if (y == 0)
return x;
else
return extgcd(y, x%y);
}
int main()
{
scanf("%d%d", &n, &m);
for (int i = 0; i < m; i++)
{
int a, b;
double c;
scanf("%d%d%lf", &a, &b, &c);
edge[i].from = a;
edge[i].to = b;
edge[i].value = c;
}
scanf("%d%d", &s, &t);
sort(edge, edge + m, com);
double ans = 1000000000;
for (int i = 0; i < m; i++)
{
init();//并查集遗忘初始化
double maxx;
double minn = edge[i].value;
for (int j = i; j < m; j++)
{
maxx = edge[j].value;//这写成了edge[i].value
unionn(edge[j].from, edge[j].to);//这写成了edge[i].to,edge[i].from
if (issame(s, t))
{
if (ans>(maxx / minn))
{
ans = maxx / minn;
realmax = maxx;
realmin = minn;
}
}
}
}
int temp = extgcd((int)realmax, (int)realmin);
if (ans == 1000000000)
printf("IMPOSSIBLE\n");
else
{
if (((int)realmax) % ((int)realmin) == 0)
printf("%d\n", (int)(realmax / realmin));
else
{
int tempmax = (int)(realmax / temp);
int tempmin = (int)(realmin / temp);
printf("%d/%d\n", tempmax, tempmin);
}
}
}
这题就是暴力先开始还以为是最短路 我还是太too young 了。。。 话说跑得真是巨慢呢。。。。。。