codevs 1001 舒适的路线 (并查集)
Z小镇是一个景色宜人的地方,吸引来自各地的观光客来此旅游观光。
Z小镇附近共有
N(<N≤)个景点(编号为1,,,…,N),这些景点被M(<M≤)条道路连接着,所有道路都是双向的,两个景点之间可能有多条道路。也许是为了保护该地的旅游资源,Z小镇有个奇怪的规定,就是对于一条给定的公路Ri,任何在该公路上行驶的车辆速度必须为Vi。频繁的改变速度使得游客们很不舒服,因此大家从一个景点前往另一个景点的时候,都希望选择行使过程中最大速度和最小速度的比尽可能小的路线,也就是所谓最舒适的路线。
输入描述 Input Description
第一行包含两个正整数,N和M。
接下来的M行每行包含三个正整数:x,y和v(≤x,y≤N, 最后一行包含两个正整数s,t,表示想知道从景点s到景点t最大最小速度比最小的路径。s和t不可能相同。
如果景点s到景点t没有路径,输出“IMPOSSIBLE”。否则输出一个数,表示最小的速度比。如果需要,输出一个既约分数。
样例1 样例2 样例3
样例1
IMPOSSIBLE 样例2
/ 样例3
N(<N≤) M(<M≤) Vi在int范围内
简单的并查集
把边权按从小到大的顺序排好序枚举每一条边,把这条边的边权作为ans_max,接下来从这条边开始按顺序(从大到小)枚举每一条比它小的边,并且把这条边的两端点划分到一个联通块中,并且判断起点和终点是否在同一个联通块中,如果在同一个联通块中,那么当前枚举到的边的权值就是ans_min,然后更新当前最优解即可。
原理:枚举、贪心,因为我们要求ans_max与ans_min的最小比值,ans_max与ans_min越接近肯定是越好的。所以我们枚举ans_max,这样就可以把ans_max当成常数,那么ans_min的值一定是越大越好(当然,它不可能大过ans_max),所以我们从当前枚举到的边开始,每次加一条略小的边进入,当S与T第一次联通时,ans_min的值是最大的,那么就能保证他们的比值是当前ans_max下最小的。
时间复杂度:o(n^2logn)空间复杂度:o(n)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stdlib.h>
#include<cmath>
using namespace std;
#define inf 1<<30
#define N 5006
////////////并查集/////////////////
#define M 506
int fa[M];
void init(){
for(int i=;i<M;i++){
fa[i]=i;
}
}
int find(int x){
return fa[x]==x?x:fa[x]=find(fa[x]);
}
void merge(int x,int y){
int root1=find(x);
int root2=find(y);
if(root1==root2){
return;
}
fa[x]=y;
}
////////////并查集/////////////////
int n,m;
struct Node{
int a,b,v;
}node[N];
bool cmp(Node x,Node y){
return x.v<y.v;
} int gcd(int x,int y){
return y==?x:gcd(y,x%y);
} int main()
{
while(scanf("%d%d",&n,&m)==){
for(int i=;i<m;i++) scanf("%d%d%d",&node[i].a,&node[i].b,&node[i].v);
sort(node,node+m,cmp);
int _max=inf;
int _min=;
int st,ed;
scanf("%d%d",&st,&ed);
for(int i=;i<m;i++){
init();
for(int j=i;j>=;j--){
merge(node[j].a,node[j].b);
if(find(st)==find(ed)){
if( (_max*1.0/_min) > (node[i].v*1.0/node[j].v) ){
_max=node[i].v;
_min=node[j].v;
//printf("===%d %d\n",_max,_min);
}
break;
}
}
}
//printf("---%d %d\n",_max,_min);
int r=gcd(_max,_min);
if(_max==inf && _min==){
printf("IMPOSSIBLE\n");
continue;
}
_max/=r;
_min/=r;
if(_min==){
printf("%d\n",_max);
}
else{
printf("%d/%d\n",_max/r,_min/r);
} }
return ;
}
codevs 1001 舒适的路线 (并查集)的更多相关文章
- 求最大边/最小边的比值最小的路径 codevs 1001 舒适的路线
codevs 1001 舒适的路线 2006年 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Z小镇是一个景色宜人 ...
- Codevs 1001 舒适的路线 2006年 NOIP全国联赛提高组
1001 舒适的路线 2006年 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Z小镇是一个景色宜人的地方,吸引来自各地的观 ...
- codevs 1001 舒适的路线(Kruskal)
传送门 Description Z小镇是一个景色宜人的地方,吸引来自各地的观光客来此旅游观光.Z小镇附近共有N(1<N≤500)个景点(编号为1,2,3,…,N),这些景点被M(0<M≤5 ...
- CODEVS 1001 舒适的路线
思路:先按照速度大小对边排序,再枚举最终路径中的速度最大值,并查集,更新答案 #include<iostream> #include<vector> #include<a ...
- bzoj 1050: [HAOI2006]旅行comf(codevs.cn 1001 舒适的路线) 快排+并查集乱搞
没用的话:好像很久没发博客了,主要是懒太蒟找不到水题.我绝对没弃坑...^_^ 还用些话:本文为博主原创文章,若转载请注明原网址和作者. 进入正题: 先pa网址: bzoj :http://www.l ...
- codevs 1001 舒适的线路 kruskal/gcd
舒适的线路 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.codevs.cn/problem/1001/ Description Z小 ...
- codevs 3372 选学霸(hash+并查集+多重背包)
先通过并查集处理出来有多少种不同的集合,每一个集合有多少人.一定要不要忘记了与别的没有联系的独立点. 并查集的时候能够通过hash处理出来每一个数目同样的集合的个数. 这样以人数为权值.个数为限制进行 ...
- 参观路线——并查集+dfs
题目描述 Lambdaland由N个城市组成,任两个城市间都有一条道路相连. 下个月TBL准备参观Lambdaland.他将从城市1开始,以深度优先搜索顺序参观能所有遍历到的城市. 由于TBL是一位 ...
- AC日记——舒适的路线 codevs 1001 (并查集+乱搞)
1001 舒适的路线 2006年 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description Z小镇是 ...
随机推荐
- Android中获取网页表单中的数据实现思路及代码
在Android中获取网页里表单中的数据具体实现代码如下,感兴趣的各位可以参考过下哈,希望对大家有所帮助 MainActivity如下: 复制代码 代码如下: package cn.testjavas ...
- rac_进行grid自检时提示运行runfixup.sh脚本一例
原创作品,出自 "深蓝的blog" 博客,欢迎转载,转载时请务必注明下面出处,否则追究版权法律责任. 深蓝的blog:http://blog.csdn.net/huangyanlo ...
- poj 1011 Sticks (DFS+剪枝)
Sticks Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 127771 Accepted: 29926 Descrip ...
- Smack+Openfire 接收和发送文件
转载请注明出处:http://blog.csdn.net/steelychen/article/details/37958839 发送文件须要提供准确的接收放username称(例:user2@192 ...
- Android UI开发详解之ActionBar .
在Android3.0之后,Google对UI导航设计上进行了一系列的改革,其中有一个非常好用的新功能就是引入的ActionBar,他用于取代3.0之前的标题栏,并提供更为丰富的导航效果. 一.添加A ...
- 用消息在Win32控制台程序多线程间进行通讯
#include <stdio.h> #include <windows.h> //#include <iostream> //#include <pro ...
- JavaScript 学习之第一篇JavaScript的数据类型(2016/8/29 晚 23:12)
1. JavaScript的数据类型 JavaScript 里面有6中数据类型 Boolean String Number Undefined Null Object object(对象)类型包含了数 ...
- telnet IP不通/sybase central工具无法连接到数据库
问题描述:客户端sybase central工具无法连接到数据库 服务端操作系统:RHEL5.8_x64,安装sybase-ASE15.7,端口号4112 IP:192.168.1.220 hos ...
- ORACLE查看数据文件-控制文件-日志文件-表空间信息
1.查看当前数据库中的所有用户:select username from dba_users; 2.查看当前会话登录的用户:show user或select username from user_us ...
- C#中唯一标识符GUID的一些知识点
概念 GUID: 即Globally Unique Identifier(全球唯一标识符) 也称作 UUID(Universally Unique IDentifier) . GUID是一个通过特定算 ...