图论一直是小C的弱项,相比其它题型,图论的花样通常会更多一点,套路也更难捉摸。

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不可能相同。

Output

  如果景点s到景点t没有路径,输出“IMPOSSIBLE”。否则输出一个数,表示最小的速度比。如果需要,输出一个既约分数。

Sample Input

  3 3
  1 2 10
  1 2 5
  2 3 8
  1 3

Sample Output

  5/4

HINT

  1<N<=500,1<=x,y<=N,0<v<30000,0<M<=5000

Solution

  看到最大和最小值我们就可以感觉到肯定不能直接走,然后很自然地想到了排序。

  这种图论的题型常常要求我们逆向思考,我们不是找一条路径去更新答案,而是枚举一个答案看它能否构成路径。

  于是我们枚举路径中的最小的那条边,从小到大加边,直到S和T连通,

  说明存在一条S到T的路径。用最后加入的这条边和枚举的最小边更新答案。

  判连通性用并查集即可。

  时间复杂度O(m^2)

  在黄学长博客里还看到一个比较妙的解法分享一下:

    

  理论复杂度是一样的,但实际远小于上界。

#include <cstdio>
#include <cstring>
#include <algorithm>
#define MN 505
#define MM 5005
#define INF 0x3FFFFFFF
using namespace std;
struct edge{int x,y,z;}b[MM];
int fa[MN];
int n,m,S,T,ans1,ans2,g; inline int read()
{
int n=,f=; char c=getchar();
while (c<'' || c>'') {if(c=='-')f=-; c=getchar();}
while (c>='' && c<='') {n=n*+c-''; c=getchar();}
return n*f;
} int getf(int x) {return fa[x]?fa[x]=getf(fa[x]):x;}
inline void gather(int x,int y) {if (x!=y) fa[x]=y;}
int gcd(int x,int y) {return y?gcd(y,x%y):x;}
bool cmp(const edge& a,const edge& b) {return a.z<b.z;} int main()
{
register int i,j;
n=read(); m=read();
for (i=;i<=m;++i)
b[i].x=read(),b[i].y=read(),b[i].z=read();
S=read(); T=read();
sort(b+,b+m+,cmp);
ans1=INF; ans2=;
for (i=;i<=m;++i)
{
memset(fa,,sizeof(fa));
for (j=i;j<=m;++j)
{
gather(getf(b[j].x),getf(b[j].y));
if (getf(S)==getf(T)) break;
}
if (j>m) break;
if ((double)b[j].z/b[i].z<(double)ans1/ans2) ans1=b[j].z,ans2=b[i].z;
}
if (i==) return *printf("IMPOSSIBLE");
g=gcd(ans1,ans2);
ans1/=g; ans2/=g;
if (ans2==) printf("%d",ans1); else printf("%d/%d",ans1,ans2);
}

Last Word

  用并查集解决图论的问题也是常见的思路。

  小C会告诉你迷之RE是因为并查集写错了?

[BZOJ]1050 旅行comf(HAOI2006)的更多相关文章

  1. BZOJ 1050 旅行comf(枚举最小边-并查集)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1050 题意:给出一个带权图.求一条s到t的路径使得这条路径上最大最小边的比值最小? 思路 ...

  2. BZOJ 1050 旅行comf 并查集+枚举下界

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1050 题目大意: 给你一个无向图,N(N<=500)个顶点, M(M<=5 ...

  3. BZOJ 1050 旅行comf

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

  4. HYSBZ - 1050(旅行comf 并查集Java实现)

    HYSBZ - 1050(旅行comf Java实现) 原题地址 解法:枚举每一条边,对于这条边,我们需要找到集合中和其值相差最小的最大边,这个集合是指与包括i边在内的ST联通集.对于这一要求,我们只 ...

  5. BZOJ 1050 旅行

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

  6. BZOJ 1050 旅行(并查集)

    很好的一道题.. 首先把边权排序.然后枚举最小的边,再依次添加不小于该边的边,直到s和t联通.用并查集维护即可. # include <cstdio> # include <cstr ...

  7. 【BZOJ】【1050】【HAOI2006】旅行comf

    枚举/暴力/Kruskal orz……我sb了……其实是sb题<_< 有一道题问的是最小极差生成树……(不记得是什么名字了,就是求最大边权与最小边权差最小的生成树)做法是枚举最小边,然后k ...

  8. BZOJ 1050 [HAOI2006]旅行comf

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

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

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

随机推荐

  1. 第十条:始终要覆盖toString()方法

    Object类提供的toString()方法如下: public String toString() {    return getClass().getName() + "@" ...

  2. Struts2之Struts2的下载与安装

    Struts2的下载 登陆struts的官网 下载Full Distribution这个选项的struts2的包. 这是Struts2的完整版,里面包括Struts2的实例应用,空实例应用,核心库,源 ...

  3. [Cerc2013]Magical GCD

    https://vjudge.net/problem/UVA-1642 题意:在一个序列中,找出一段连续的序列,使得长度*gcd最大 固定右端点,当左端点从左向右移动时,gcd不变或变大 gcd相同时 ...

  4. v7000数据恢复_MDisk重建数据恢复方法(北亚数据恢复)

    很多工程师都有这样的疑问,MDisk重建后还能不能恢复数据呢?应该怎么做才能恢复数据呢?本文这里就以IBM V7000存储为例,详细讲解因为某个MDisk被重建导致的数据丢失的恢复方法.我们本案例中的 ...

  5. Solr搜索引擎搭建详细过程

    1    什么是solr Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器.Solr可以独立运行在Jetty.Tomcat等这些Servlet容器中 ...

  6. Spring+Hibernate+Struts(SSH)框架整合

    SSH框架整合 前言:有人说,现在还是流行主流框架,SSM都出来很久了,更不要说SSH.我不以为然.现在许多公司所用的老项目还是ssh,如果改成流行框架,需要成本.比如金融IT这一块,数据库dao层还 ...

  7. 新概念英语(1-113)Small Change

    Lesson 113 Small Change 零钱 Listen to the tape then answer this question. Who has got some change?听录音 ...

  8. Angular 学习笔记 ( CDK - Observers )

    <div class="projected-content-wrapper" (cdkObserveContent)="projectContentChanged( ...

  9. Python学习之list有序集合

    # coding=utf-8 # list有序集合 classmate = ['Michael', 'Bob', 'Tracy'] print classmate print len(classmat ...

  10. Django:(博客系统)使用使用mysql数据&创建post/category/tag实体,并同步到数据中

    背景: 之前也读过一些关于django的一些书,看过别人写的一些博客系统.但是总有一种看别人的都会,但自己写不出来的感觉,于是为了加深对django的学习就开始动手学习了. 环境搭建: 环境:使用py ...