没用的话:好像很久没发博客了,主要是懒太蒟找不到水题。我绝对没弃坑...^_^

还用些话:本文为博主原创文章,若转载请注明原网址和作者。

进入正题:

先pa网址: bzoj :http://www.lydsy.com/JudgeOnline/problem.php?id=1050

codevs.cn:http://codevs.cn/problem/1001/

题目描述就放bzoj的(主要是为了配合标题)(ps:codevs和bzoj的题目描述不一样)。

Description

  给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000)。给你两个顶点S和T
,求一条路径,使得路径上最大边和最小边的比值最小。如果S和T之间没有路径,输出”IMPOSSIBLE”,否则输出
这个比值,如果需要,表示成一个既约分数。 备注: 两个顶点之间可能有多条路径。

(其实我A完这题还不知道这图有何用,我猜测这图是来旅游的放错位置了)

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

思路:其实一开始一点思路都没有,就想spfa乱搞,结果A了1个点(我不会告诉你那个点是“IMPOSSIBLE”)。

听到大神犇 QZZ 和 ZN 说什么并查集,不管说什么,膜就对了!!!

Orz!Orz!Orz!Orz!Orz!Orz!Orz!Orz!Orz!

然后蒟蒻我就默默看了题解我认认真真地思(kan)考(le)了(ti)下(jie)。不要在意括号说了什么!!认真看了,下面才是重点,上面只是凑个字数。

大概就是:1、按边权(v[i])从小到大(其实从大到小也可以,自己去乱搞)排序。

2、从大到小枚举边,记录max(最大权值,因为排序,所以max=v[当前枚举的边的编号])。

3、再来一重枚举从大(当前枚举的边)到小,用并查集合并 x,y 节点,主要是用来判断合并后 s(起点),t(终点) 是否联通。

4、判断 s,t 联通后就可以来更新答案(最大速度和最小速度的比值),并记录最大速度和最小速度。

5、约分输出答案。

基本上是这样做的。

下面就代码:

pascal:

var n,m,s,t:longint;
i,j:longint;
father,x,y,v:array[..]of longint;
ans:real; //用来储存最大速度和最小速度的比值
ansmax,ansmin,min,max:longint;//分别为 最大速度 最小速度 枚举到的最小速度 枚举到的最大速度
gcdxy:longint;//最大公因数,为了约分
function getfather(x:longint):longint;//并查集找祖先
begin
if father[x]=x then exit(x) else
begin
father[x]:=getfather(father[x]);
getfather:=father[x];
end;
end; procedure join(x,y:longint);//并查集合并
var fx,fy:longint;
begin
fx:=getfather(x);
fy:=getfather(y);
if fx<>fy then father[fx]:=fy;
end; function gcd(x,y:longint):longint;//最大公因数
begin
if y= then exit(x) else
exit(gcd(y,x mod y));
end;
procedure qs(l,r:longint);//快排
var i,j,t,m:longint;
begin
i:=l;
j:=r;
m:=v[(l+r) >> ];
repeat
while v[i]<m do inc(i);
while v[j]>m do dec(j);
if i<=j then
begin
t:=v[i];v[i]:=v[j];v[j]:=t;
t:=x[i];x[i]:=x[j];x[j]:=t;
t:=y[i];y[i]:=y[j];y[j]:=t;
inc(i);
dec(j);
end;
until i>j;
if l<j then qs(l,j);
if i<r then qs(i,r);
end; begin
read(n,m);
for i:= to m do
read(x[i],y[i],v[i]);
readln(s,t);
qs(,m);
ans:=maxlongint;//先初始答案为∞
for i:=m downto do
begin
max:=v[i];//枚举到的最大速度
for j:= to n do
father[j]:=j;// 并查集初始化
for j:=i downto do
begin
join(x[j],y[j]);//合并
if getfather(s)=getfather(t) then //判断 s,t 是否联通
begin
min:=v[j]; //枚举到的最小速度
if ans>max/min then //答案更优就更新
begin
ans:=max/min;
ansmax:=max;
ansmin:=min;
end;
end;
end;
end;
if ansmin= then //如果最大速度或最小速度还都为0 说明都没更新过,所以 s,t 无法联通
begin
writeln('IMPOSSIBLE');
exit;
end;
gcdxy:=gcd(ansmax,ansmin); //最大公约数+约分 就不说了吧
if gcdxy=ansmin then writeln(ansmax div ansmin) else
writeln(ansmax div gcdxy,'/',ansmin div gcdxy);
end.

一直都是这样啦,c++ 有时间再补上!!

然后蒟蒻我又水了一篇博客。

bzoj 1050: [HAOI2006]旅行comf(codevs.cn 1001 舒适的路线) 快排+并查集乱搞的更多相关文章

  1. BZOJ 1050 [HAOI2006]旅行comf

    1050: [HAOI2006]旅行comf Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1889  Solved: 976[Submit][Sta ...

  2. BZOJ 1050: [HAOI2006]旅行comf( 并查集 )

    将edge按权值排序 , O( m² ) 枚举边 , 利用并查集维护连通信息. ------------------------------------------------------------ ...

  3. bzoj 1050 [HAOI2006]旅行comf (并查集)

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1050 思路: 先将每条边的权值排个序优先小的,然后从小到大枚举每一条边,将其存到并查集 ...

  4. bzoj 1050 [HAOI2006]旅行comf——kruscal

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1050 因为还有Impossible的情况,所以想到了kruscal.(?) 但好像不太行.然 ...

  5. BZOJ 1050: [HAOI2006]旅行comf (并查集 或 单调队列)

    这是建空间后做的第一道题啊= =好水 排序,枚举最小边,然后并查集求出联通时的最大边 或者排次序,从小到大插边,如果插边时最小的边拿掉不会使s与t不联通,就删去。 code: #include< ...

  6. bzoj 1050: [HAOI2006]旅行comf&&【codevs1001】

    Description 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000).给你两个顶点S和T,求 一条路径,使得路径上最 ...

  7. bzoj 1050: [HAOI2006]旅行comf【枚举+并查集】

    m是5000,就想到了直接枚举比例 具体做法是是先把边按照边权从小到大排序,然后先枚举最小边权,再枚举最大边权,就是从最小边权里一个一个加进并查集里,每次查st是否联通,联通则退出,更新答案 #inc ...

  8. BZOJ 1050 [HAOI2006]旅行comf(最小生成树)

    题意 第一行包含两个正整数,N和M.下来的M行每行包含三个正整数:x,y和v.表示景点x到景点y之间有一条双向公路 ,车辆必须以速度v在该公路上行驶.最后一行包含两个正整数s,t,表示想知道从景点s到 ...

  9. 【BZOJ 1050】1050: [HAOI2006]旅行comf (动态SPFA)

    1050: [HAOI2006]旅行comf Description 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000). ...

随机推荐

  1. Java中匿名内部类

    匿名内部类也就是没有名字的内部类 正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写 但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口 实例1:不使用匿名内部类来实现抽象 ...

  2. 编写高质量代码–改善python程序的建议(五)

    原文发表在我的博客主页,转载请注明出处! 建议二十三:遵循异常处理的几点基本原则 python中常用的异常处理语法是try.except.else.finally,它们可以有多种组合,语法形式如下: ...

  3. 求其中同一个主叫号码的两次通话之间间隔大于10秒的通话记录ID

    求其中同一个主叫号码的两次通话之间间隔大于10秒的通话记录ID 例如:6,7,8,9,10条记录均符合 ID 主叫号码 被叫号码      通话起始时间            通话结束时间       ...

  4. JS中:数组和二维数组、MAP、Set和枚举的使用

    1.数组和二维数组:   方法一: var names = ['Michael', 'Bob', 'Tracy']; names[0];// 'Michael' 方法二: var mycars=new ...

  5. 第4章 x86反汇编速成班

    4.1 抽象层次 硬件<微指令<机器码<低级语言<高级语言<解释型语言 4.2 逆向工程 4.3 x86体系结构 冯-诺依曼体系结构 中央处理器(CPU): 负责执行代码 ...

  6. JPA 对象关系映射之关联关系映射策略

    关联关系映射 关联关系映射,是映射关系中比较复杂的一种映射关系,总的说来有一对一.一对多和多对多几种关系.细分起来他们又有单向和双向之分.下面我们逐一介绍一下. 回页首 单向 OneToOne 单向一 ...

  7. Android Wear - Design Principles for Android Wear(设计原则)

    ---------------------------------------------------------------------------------------------------- ...

  8. Go 结构体和map等数据结构转json字符串

    Go语言中使用json包中的 Marshal() 函数将数据结构转成json字符串,源代码: func Marshal(v interface{}) ([]byte, error) { e := ne ...

  9. 【TensorFlow】tf.nn.conv2d是怎样实现卷积的?

    tf.nn.conv2d是TensorFlow里面实现卷积的函数,参考文档对它的介绍并不是很详细,实际上这是搭建卷积神经网络比较核心的一个方法,非常重要 tf.nn.conv2d(input, fil ...

  10. Redis持久化方式RDB和AOF

    Redis 持久化 RDB(快照) 优点 rdb是可进行压缩的二进制文件,表示Redis在某一个时间点的数据快照.非常使用与备份,灾难恢复等场景.比如使用定时任务执行bgsave并备份rdb到serv ...