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を使って点数を解いて、この問題は解決しました.
コード:
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;
}
}