codevs 1001 舒适的路线 玄学方法 解题报告
来源:互联网 发布:java服务器路径怎么写 编辑:程序博客网 时间:2024/05/28 05:17
题目描述 Description
Z小镇是一个景色宜人的地方,吸引来自各地的观光客来此旅游观光。
Z小镇附近共有
N(1
输入描述 Input Description
第一行包含两个正整数,N和M。
接下来的M行每行包含三个正整数:x,y和v(1≤x,y≤N,0 最后一行包含两个正整数s,t,表示想知道从景点s到景点t最大最小速度比最小的路径。s和t不可能相同。
输出描述 Output Description
如果景点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
数据范围及提示 Data Size & Hint
N(1
思路
我们可以先把边排序,然后我们想一下,我们要求一条路,这条路上的最大值和最小值的比值最小,那么显然,我们应该是最大值一定的情况下,最小值尽可能的大。所以我们排完序之后,我们从长边到短边开始枚举最大边,然后我们从这条边开始往下枚举,每次把边的两点联通,然后判断起点终点是否联通,如果联通,则用当前选取的最大边和最小边尝试更新答案。最后求出最优情况下最大边和最小边的大小之后,如果不能整除,gcd一下搞成分数就行了!
代码
#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>using namespace std;struct lx{ int x,y,w;};bool operator < (const lx &x,const lx &y){ return x.w > y.w;}int n,m,s,t,fa[1000],size[1000],maxn,minn,amaxn,aminn;double pmin;lx sz[10001];bool lt;int getfa(int x){ if (fa[x]==x) return x; return fa[x]=getfa(fa[x]);}void merge(int x,int y){ if (getfa(x)==getfa(y)) return ; int s1=getfa(x),s2=getfa(y); if (size[s1]<size[s2]) { fa[s1]=s2; size[s2]+=size[s1]; } else { fa[s2]=s1; size[s1]+=size[s2]; }}void init(){ for (int i=1;i<=n;i++) fa[i]=i,size[i]=1;}int gcd(int x,int y){ return !y?x:gcd(y,x%y);}int main(){ pmin=9999999999999.0; scanf("%d%d",&n,&m); for (int i=1;i<=m;i++) scanf("%d%d%d",&sz[i].x,&sz[i].y,&sz[i].w); scanf("%d%d",&s,&t); sort(sz+1,sz+m+1); for (int i = 1;i < m;i++) { init(); maxn=sz[i].w; merge(sz[i].x,sz[i].y); if (getfa(s)==getfa(t)) { amaxn=sz[i].w; aminn=sz[i].w; lt=true; break; } minn=0;//就是开始在这个位置没有初始化 for (int j=i+1;j<=m;j++) { merge(sz[j].x,sz[j].y); if (getfa(s)==getfa(t)) { lt=true; minn=sz[j].w; break; } } double t1=maxn,t2=minn; if (minn)//这个位置也没有判0 if ((t1/t2)<pmin) { pmin=t1/t2; amaxn=maxn; aminn=minn; } } if (!lt) printf("IMPOSSIBLE\n");else { if (!(amaxn%aminn)) printf("%d\n",amaxn/aminn);else { int tp=gcd(amaxn,aminn); printf("%d/%d\n",amaxn/tp,aminn/tp); } } return 0;}
阅读全文
1 0
- codevs 1001 舒适的路线 玄学方法 解题报告
- codevs 1001 舒适的路线 解题报告 (枚举+并查集)
- Codevs 1001 舒适的路线
- codevs 1001 舒适的路线
- Codevs 1001 舒适的路线
- codevs 1001 舒适的路线
- 【codevs 1001】舒适的路线
- codevs 1001 舒适的路线
- 【codevs 1001】舒适的路线
- CODEVS 1001舒适的路线
- codevs 舒适的路线 1001
- codevs 1001 舒适的路线
- CODEVS 1001 舒适的路线
- codevs 1001 舒适的路线
- 【codevs 1001】舒适的路线
- 舒适的路线(SPFA)解题报告
- 【codevs 1001】 【bzoj1050】舒适的路线
- CODEVS 1001 舒适的路线 题解
- 【js基础】javascript中的apply() call() bind() 方法是javascript专业人员的基础[译]
- 《数据库系统概念(第六版)》读书笔记——第6章:高级SQL
- 安装HP LaserJet 1320n打印机驱动
- 字符串匹配---KMP
- 2017搜狗第一道编程题,构建数列
- codevs 1001 舒适的路线 玄学方法 解题报告
- 剑指offer(24)—二叉树中和为某一值的路径
- 年度总结
- SQL 简单查询
- 速度版运动框架(获得属性+requestAnimationFrame请求动画帧)
- 群体智能优化算法之粒子群优化算法
- ActivityThread启动源码解析
- Linux运维攻城狮必会的10大工具
- 局部最小值位置、元素最左出现、循环有序数组最小值