异形卵潜伏在某区域的一个神经网络中。其网络共有 N 个神经元(编号为 1,2,3,…,N),这些 神经元由 M 条通道连接着。两个神经元之间可能有多条通道。异形卵可以在这些通道上来回游动, 但在神经网络中任一条通道的游动速度必须是一定的。当然异形卵不希望从一条通道游动到另一 条通道速度变化太大,否则它会很不舒服。 现在异形卵聚居在神经元 S 点,想游动到神经元 T 点。它希望选择一条游动过程中通道最大 速度与最小速度比尽可能小的路线,也就是所谓最舒适的路线。
【标准输入】
第一行: K 表示有多少组测试数据。
接下来对每组测试数据:
第 1 行: N M 第 2~M+1 行: Xi Yi Vi (i=1,……,M) 表示神经元 Xi 到神经元 Yi 之间通道的速度必须是 Vi 最后一行: S T ( S != T )
【标准输出】
对于每组测试数据,输出一行:如果神经元 S 到神经元 T 没有路线,输出“IMPOSSIBLE”。 否则输出一个数,表示最小的速度比。如果需要,输出一个既约分数。 【约束条件】 2≤K≤5 1<N≤500 0<M≤5000 1≤ Xi, Yi , S , T ≤N 0< Vi <30000, Vi 是整数。数据之间有一个空格。
【 样 例 】
标准输入 | 标准输出 |
---|---|
2 | 2 |
3 2 | 5/4 |
1 2 2 | |
2 3 4 | |
1 3 | |
3 3 | |
1 2 10 | |
1 2 5 | |
2 3 8 | |
1 3 |
【 代 码 实 现 】
#include <iostream>
#include <cstring>
using namespace std;
const int MAXN=5010;
int A[MAXN][2];
int main() {
int K, N, M, S, T, Xi, Yi, Xii=-100, Yii=-100, ZB=1;
int Vi, max=0, min=30000, max1=30000, min1=30000;
int a, b;
cin>>K;
while(K--) {
memset(A,0,sizeof(A));
cin>>N>>M;
for(int i=0; i<M; i++) {
cin>>Xi>>Yi>>Vi;
if(Xi==Xii) {
A[i-1][0]=ZB;
A[i][0]=ZB;
A[i][1]=Vi;
} else {
A[i][1]=Vi;
ZB++;
}
Xii=Xi;
Yii=Yi;
}
cin>>S>>T;
for(int i=0; i<M; i++) {
if(!A[i][0]) {
if(A[i][1]>max) max=A[i][1];
if(A[i][1]<min) min=A[i][1];
}
}
for(int i=0; i<M; i++) {
if(A[i][0]) {
if(A[i][1]<min) {
if(min-A[i][1]<min1) min1=min-A[i][1];
} else if(A[i][1]>max) {
if(A[i][1]-max<max1) max1=A[i][1]-max;
}
if(A[i][0]!=A[i+1][0] || i+1==M) {
max1>min1? min-=min1:max+=max1;
max1=30000;
min1=30000;
}
}
}
if(max%min==0) cout<<max/min;
else {
a=max;
b=min;
while(a*b!=0) {
if(a>b) {
a = a%b;
} else {
b = b%a;
}
}
if(a==0) cout<<max/b<<"/"<<min/b;
else cout<<max/a<<"/"<<min/a;
}
max=0;
min=30000;
Xii=-100;
Yii=-100;
ZB=1;
}
return 0;
}