用kruskal的思想。
因为数据比较小,所以用O(m*m)完全可以过。
思路:
将速度按从大到小排列(你想从小到大也可以的)
然后,从大到小,一个一个枚举。
然后再在里面套一重循环,一个一个加入,直到从s到t有路可走(也就是同属于一个集合),就比较比值,如果小于当前最小值,就更新它。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
struct aaaa{int from,to,v;};
aaaa bian[5010];
int n,m,big=999999999,small=1,aimx,aimy,bing[501];
bool cmp(aaaa a,aaaa b);
void hebing(int a,int b);
int findf(int a);
int gb(int a,int b);
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
{
cin>>bian[i].from>>bian[i].to>>bian[i].v;
}
sort(bian+1,bian+1+m,cmp);
cin>>aimx>>aimy;
for(int i=1;i<=m;i++){
memset(bing,0,sizeof(bing));
for(int j=i;j<=m;j++){
int fa1=findf(bian[j].from),fa2=findf(bian[j].to);
if(fa1!=fa2)hebing(fa1,fa2);
if(findf(aimx)==findf(aimy)){
if(bian[i].v*1.0/bian[j].v<big*1.0/small){big=bian[i].v;small=bian[j].v;break;}
}
}
}
if(big==999999999){cout<<"IMPOSSIBLE";}
else {
if(big/small*small==big)cout<<big/small;
else {
int key=gb(big,small);
cout<<big/key<<"/"<<small/key;
}
}
return 0;
}
bool cmp(aaaa a,aaaa b){
return a.v>b.v;
}
int findf(int a)
{
int b=a;
while(bing[a]!=0){
a=bing[a];
}
while(bing[b]!=0){
int t=bing[b];
bing[b]=a;
b=t;
}
return a;
}
void hebing(int a,int b){
bing[b]=a;
}
int gb(int a,int b)
{
if(b==0)return a;
else return gb(b,a%b);
}