BZOJ 1050 旅行comf【暴力枚举+生成树】
2017-02-05 18:11
246 查看
1050: [HAOI2006]旅行comf
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3038 Solved: 1672
[Submit][Status][Discuss]
Description
给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000)。给你两个顶点S和T,求一条路径,使得路径上最大边和最小边的比值最小。如果S和T之间没有路径,输出”IMPOSSIBLE”,否则输出
这个比值,如果需要,表示成一个既约分数。 备注: 两个顶点之间可能有多条路径。
Input
第一行包含两个正整数,N和M。下来的M行每行包含三个正整数:x,y和v。表示景点x到景点y之间有一条双向公路,车辆必须以速度v在该公路上行驶。最后一行包含两个正整数s,t,表示想知道从景点s到景点t最大最小速
度比最小的路径。s和t不可能相同。
1<N<=500,1<=x,y<=N,0<v<30000,0<M<=5000
Output
如果景点s到景点t没有路径,输出“IMPOSSIBLE”。否则输出一个数,表示最小的速度比。如果需要,输出一个既约分数。
Sample Input
【样例输入1】4 2
1 2 1
3 4 2
1 4
【样例输入2】
3 3
1 2 10
1 2 5
2 3 8
1 3
【样例输入3】
3 2
1 2 2
2 3 4
1 3
Sample Output
【样例输出1】IMPOSSIBLE
【样例输出2】
5/4
【样例输出3】
2
思路:
1、要一条从s到t的路径,那么我们可以用生成树来完成这个任务。
2、那么我们首先将边按照从小到大排序。接下来枚举最小权值边,开始并查集处理并生成一颗使得从s到t连通的树,那么最后一条入树边和第一条入树边就是这条路径上的最小权值边和最大权值边。
过程维护最小比值,最终按照要求输出即可。
Ac代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int f[505];
struct node
{
int x,y,w;
}a[50005];
int gcd(int x,int y)
{
if(y==0)return x;
else return gcd(y,x%y);
}
int find(int a)
{
int r=a;
while(f[r]!=r)
r=f[r];
int i=a;
int j;
while(i!=r)
{
j=f[i];
f[i]=r;
i=j;
}
return r;
}
int merge(int a,int b)
{
int A,B;
A=find(a);
B=find(b);
if(A!=B)
{
f[B]=A;
}
}
int cmp(node a,node b)
{
return a.w<b.w;
}
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
double minn=1000000000000000000;
int flag=0;
int ans1,ans2;
for(int i=0;i<m;i++)scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].w);
int s,e;
scanf("%d%d",&s,&e);
sort(a,a+m,cmp);
for(int l=0;l<m;l++)
{
int first=-1;
int final=0;
for(int i=1;i<=n;i++)f[i]=i;
for(int i=l;i<m;i++)
{
if(find(a[i].x)!=find(a[i].y))
{
merge(a[i].x,a[i].y);
if(first==-1)first=a[i].w;
final=a[i].w;
}
if(find(s)==find(e))
{
flag=1;
int g=gcd(first,final);
if(final*1.0/first*1.0<minn)
{
minn=final*1.0/first*1.0;
ans1=first/g;
ans2=final/g;
}
}
}
}
if(flag==0)printf("IMPOSSIBLE\n");
else if(ans1==1)printf("%d\n",ans2);
else printf("%d/%d\n",ans2,ans1);
}
}
相关文章推荐
- 【BZOJ 1050】 【HAOI 2006】旅行comf(最小生成树枚举)
- BZOJ 1050 旅行comf(枚举最小边-并查集)
- [BZOJ1050]HAOI2007旅行|最小生成树|枚举
- bzoj 1050: [HAOI2006]旅行comf(最小生成树+并查集)
- 【BZOJ1050】【枚举+并查集】旅行comf
- bzoj 1050 [HAOI2006]旅行comf (最小生成树)
- bzoj 1050: [HAOI2006]旅行comf【枚举+并查集】
- bzoj 1050 [HAOI2006]旅行comf [最小生成树] [动点spfa] [LCT]
- 【BZOJ】1050: [HAOI2006]旅行comf(暴力+并查集)
- 【bzoj1050】 HAOI2006旅行comf 最小生成树
- bzoj 1050: [HAOI2006]旅行comf 并查集
- BZOJ 1050: [HAOI2006]旅行comf( 并查集 )
- BZOJ 1050 HAOI 2006 旅行comf SPFA动态加点
- BZOJ 1050 HAOI2006 旅行comf 动点SPFA
- 【BZOJ 1050】 [HAOI2006]旅行comf
- bzoj1050 [HAOI2006]旅行comf
- bzoj1050 [HAOI2006]旅行comf
- BZOJ1050 [HAOI2006]旅行comf
- BZOJ 1050 [HAOI2006]旅行comf
- bzoj1050: [HAOI2006]旅行comf MST