BZOJ 1050 旅行comf
来源:互联网 发布:类似于zine的软件 编辑:程序博客网 时间:2024/06/08 20:06
1050: [HAOI2006]旅行comf
Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 3515 Solved: 1961
[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
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
HINT
Source
题解:
本来说今天下午练并查集的,也算是并查集了吧。
先将边权sort一遍,然后枚举最小的边建最小生成树(最小边确定的情况下,肯定最大的边越小越好),然后判断这个答案是否可以更新。
时间复杂度O(m^2)
如果枚举的最小边并不是s到t的路径,即这条边对联通s、t没有任何贡献。如果这条边小于能够联通s到t上的最小边的话,这个答案其实没有用。如果这条边大于的话,则不会联通。所以不用在意是否会造成错误的答案。
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int N = 500 + 10;const int M = 5000 + 10;const int inf = 0x73f3f3f;int n,m;inline int 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 u,v,w;}e[M];int fa[N];int s,t;inline bool cmp(node a,node b) {return a.w<b.w;}inline int Max(int a,int b) {return a>b?a:b;}inline int Min(int a,int b) {return a<b?a:b;}int mmin,mmax;int find(int x){ if(x==fa[x]) return x; return fa[x]=find(fa[x]);}int gcd(int a,int b) {return b==0?a:gcd(b,a%b);}double ans1=inf;int ans[2];void checkans(int a,int b){ double x=(double)a/b; if(x<ans1){ ans1=x; int y=a/b; if(b*y==a) ans[0]=y,ans[1]=-1; else {y=gcd(a,b);ans[0]=a/y,ans[1]=b/y;} }}void print(){ if(ans[0]==-1) printf("IMPOSSIBLE\n"); else if(ans[1]==-1) printf("%d\n",ans[0]); else printf("%d/%d\n",ans[0],ans[1]);}int main(){ n=read(),m=read(); for(register int i=1;i<=m;i++) e[i].u=read(),e[i].v=read(),e[i].w=read(); s=read(),t=read(); sort(e+1,e+m+1,cmp); int st=1; ans[0]=-1; while(st<=m){ for(register int i=1;i<=n;i++) fa[i]=i; for(register int i=st;i<=m;i++){ int u=e[i].u,v=e[i].v; int x=find(u),y=find(v); if(x!=y){ fa[x]=y; } else continue; x=find(s),y=find(t); if(x==y){ checkans(e[i].w,e[st].w); break; } } if(find(s)!=find(t)) break; ++st; } print(); return 0;}
- BZOJ 1050 旅行comf
- BZOJ 1050: [HAOI2006]旅行comf
- 【BZOJ 1050】 [HAOI2006]旅行comf
- BZOJ 1050: [HAOI2006]旅行comf
- BZOJ 1050 [HAOI2006]旅行comf
- bzoj 1050: [HAOI2006] 旅行comf
- 【bzoj 1050】 [HAOI2006]旅行comf
- BZOJ 1050 [HAOI2006]旅行comf
- BZOJ 1050 [HAOI2006]旅行comf
- BZOJ 1050: [HAOI2006]旅行comf
- [BZOJ 1050&&HAOI 2006]旅行comf
- [BZOJ]1050: [HAOI2006]旅行comf SPFA
- BZOJ 1050 [HAOI2006]旅行comf Kruskal
- 旅行comf BZOJ
- BZOJ 1050 HAOI2006 旅行comf 动点SPFA
- BZOJ 1050 HAOI 2006 旅行comf SPFA动态加点
- BZOJ-1050 旅行comf 并查集+乱搞
- BZOJ 1050: [HAOI2006]旅行comf|动点spfa
- webconfig 中的 configSections 自定义节点
- 并发中的i++安全问题浅述
- ScrollView嵌套webview,webview跳转后页面不能置顶
- 先验概率与后验概率的区别
- vsftpd配置文件详解
- BZOJ 1050 旅行comf
- [线段树模拟Treap]Codechef COT5 .Count on a Treap
- struct初始化
- POJ 1182 并查集 解题报告
- 南京一市民起诉影院映前插播广告案宣判:电影院被判书面道歉
- 20170925_虚拟存储器
- popwindow弹出后点击外部控件响应点击事件
- WPA-PSK 4-way handshake 四次握手过程
- S4 更新MSEG失败sy-subrc = 4