codevs 1001快適なラインkruskyal/gcd

11823 ワード

快適なライン
Time Limit:1 Sec  メモリLimit:256 MB
タイトル接続http://www.codevs.cn/problem/1001/
Description
Z小鎮は景色のいいところで、各地からの観光客が観光に来ます.Z小鎮の近くにN(1<N≦500)の観光スポット(番号は1、2、3、…、N)があります.これらの観光スポットはM(0<M≦5000)の道に接続されています.すべての道は双方向で、二つの観光スポットの間に複数の道があります.観光資源を保護するためかもしれませんが、Z町には奇異な規定があります.所与の道路Riに対して、どの道路を走っても車の速度はViでなければなりません.頻繁に速度を変えると、観光客の気分が悪くなります.だから、みんなは一つの観光スポットから別の観光スポットに行く時、最大速度と最小速度の比率ができるだけ小さいルートを選びたいです.つまり、一番快適なルートです.
Input
最初の行は2つの正の整数、NとMを含む.次のM行は各行に3つの正の整数を含みます.x、yとv(1≦x、y≦N、0の最後の行には2つの正の整数sが含まれています.tは観光スポットsから観光スポットtまでの最大の最小速度が最小のルートよりも小さいことを知りたいと表しています.sとtは同じはずがありません.
Output
観光スポットsから観光スポットtまでのパスがない場合は、「IMPOSSIBLE」を出力します.そうでない場合は、最小の速度比を出力します.必要であれば既約分を出力します.
Sample Input
サンプル1
4 2
1 2 1
3 4 2
1 4
サンプル2
3
1 2 10
1 2 5
2 3 8
1 3
サンプル3
3 2
1 2
2 3 4
1 3
Sample Output
サンプル1
IMPOSSIBLE
サンプル2
5/4
サンプル3
2
HINT
N(1<N≦500)
M(0<M≦5000)
Vi intの範囲内
題意
クイズ: kruskyalで探せばいいです.
列挙で使う辺の数、最小辺を列挙して、それからやるといいです.
最後にgcdを使って点数を解いて、この問題は解決しました.
コード:
 
//qscqesze
#include <cstdio>
#include <cmath>
#include <cstring>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <set>
#include <vector>
#include <sstream>
#include <queue>
#include <typeinfo>
#include <fstream>
#include <map>
typedef long long ll;
using namespace std;
//freopen("D.in","r",stdin);
//freopen("D.out","w",stdout);
#define sspeed ios_base::sync_with_stdio(0);cin.tie(0)
#define maxn 200001
#define mod 10007
#define eps 1e-9
//const int inf=0x7fffffff;   //   
const int inf=0x3f3f3f3f;
/*
inline ll read()
{
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
int buf[10];
inline void write(int i) {
  int p = 0;if(i == 0) p++;
  else while(i) {buf[p++] = i % 10;i /= 10;}
  for(int j = p-1; j >=0; j--) putchar('0' + buf[j]);
  printf("
"); }
*/ //************************************************************************************** inline ll read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } struct node { int x,y,z; }; node a[maxn]; int fa[maxn]; bool cmp(node a,node b) { return a.z<b.z; } int fi(int x) { if(x!=fa[x]) return fi(fa[x]); return x; } void un(int x,int y) { x=fi(x); y=fi(y); if(x!=y) fa[y]=x; } int gcd(int x,int y) { return y==0?x:gcd(y,x%y); } int main() { int n,m,s,t; n=read(),m=read(),s=read(),t=read(); for(int i=0;i<m;i++) cin>>a[i].x>>a[i].y>>a[i].z; sort(a,a+n,cmp); double mi=inf; int ans[2]; ans[0]=-1; ans[1]=-1; for(int i=0;i<m;i++) { for(int j=0;j<n+1;j++) fa[j]=j; for(int j=i;j<m;j++) { un(a[j].x,a[j].y); if(fi(s)==fi(t)) { if(mi*a[i].z>=a[j].z*1.0) { mi=a[j].z*1.0/a[i].z; ans[0]=a[i].z; ans[1]=a[j].z; } } } } if(ans[0]==-1) cout<<"IMPOSSIBLE"<<endl; else { cout<<ans[1]<<" "<<ans[0]<<endl; int x=gcd(ans[1],ans[0]); ans[1]/=x; ans[0]/=x; if(ans[1]%ans[0]==0) cout<<ans[1]/ans[0]<<endl; else cout<<ans[1]<<"/"<<ans[0]<<endl; } }