[BZOJ]1050 旅行comf(HAOI2006)
图论一直是小C的弱项,相比其它题型,图论的花样通常会更多一点,套路也更难捉摸。
Description
Input
Output
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)的更多相关文章
- BZOJ 1050 旅行comf(枚举最小边-并查集)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1050 题意:给出一个带权图.求一条s到t的路径使得这条路径上最大最小边的比值最小? 思路 ...
- BZOJ 1050 旅行comf 并查集+枚举下界
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1050 题目大意: 给你一个无向图,N(N<=500)个顶点, M(M<=5 ...
- BZOJ 1050 旅行comf
题目如下: 题目描述 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000).给你两个顶点S和T,求一条路径,使得路径上最大边 ...
- HYSBZ - 1050(旅行comf 并查集Java实现)
HYSBZ - 1050(旅行comf Java实现) 原题地址 解法:枚举每一条边,对于这条边,我们需要找到集合中和其值相差最小的最大边,这个集合是指与包括i边在内的ST联通集.对于这一要求,我们只 ...
- BZOJ 1050 旅行
Description 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000).给你两个顶点S和T,求一条路径,使得路径上最大 ...
- BZOJ 1050 旅行(并查集)
很好的一道题.. 首先把边权排序.然后枚举最小的边,再依次添加不小于该边的边,直到s和t联通.用并查集维护即可. # include <cstdio> # include <cstr ...
- 【BZOJ】【1050】【HAOI2006】旅行comf
枚举/暴力/Kruskal orz……我sb了……其实是sb题<_< 有一道题问的是最小极差生成树……(不记得是什么名字了,就是求最大边权与最小边权差最小的生成树)做法是枚举最小边,然后k ...
- BZOJ 1050 [HAOI2006]旅行comf
1050: [HAOI2006]旅行comf Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1889 Solved: 976[Submit][Sta ...
- BZOJ 1050: [HAOI2006]旅行comf( 并查集 )
将edge按权值排序 , O( m² ) 枚举边 , 利用并查集维护连通信息. ------------------------------------------------------------ ...
随机推荐
- 《高级软件测试》11.14.安装和运行Jira
今日任务完成情况如下: 小段:研究Jira在Linux的安装教程 小费:尝试在Ubuntu下安装Jira 小高:查阅了关于Jira软件的介绍和安装教程,下载准备明天安装,并学习使用 小王:注册Jira ...
- LR录制脚本的时候打不开浏览器问题
使用Chrome时,显示开始录制但是Action中无任何脚本,即脚本没成功生成. 使用Firefox(最新版),一直关闭程序,详细信息有StackHash_0a9e. 使用IE11时,也是显示开始录制 ...
- Python-面向对象(一)-Day7
Day7-面向对象基础 1一.isinstance(obj, cls) 1二.issubclass(sub, super) 1三.异常处理 11.异常基础 12.异常种类 23.异常其他结构 54.主 ...
- R语言-离职率分析
案例:员工流失是困扰企业的关键因素之一,在这次的分析中我将分析以下内容: 对一些重要变量进行可视化及探索分析,收入,晋升,满意度,绩效,是否加班等方面进行单变量分析 分析员工流失的因素,探索各个变量的 ...
- 快速搭建fabric-v1.1.0的chaincode开发环境
本文参考了fabric官方文档:http://hyperledger-fabric.readthedocs.io/en/latest/peer-chaincode-devmode.html?highl ...
- angular2 学习笔记 ( 4.0 初探 )
目前是 4.0.0-rc.2. 刚好有个小项目要开发,就直接拿它来试水啦. 更新 cli 到最新版, 创建项目, 然后 follow https://github.com/angular/angula ...
- Spring Security 入门(1-9)国际化的使用
- SQL Server数据库优化的10多种方法
巧妙优化sql server数据库的几种方法,在实际操作中导致查询速度慢的原因有很多,其中最为常见有以下的几种:没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷). I/O吞吐量小, ...
- IDEA安装和JDK的配置
安装: 免费获取注册码: http://idea.lanyus.com/ 将其压缩包解压后: 应用程序在bin目录下 打开之后: 选择第二个,输入刚获取的验证码: 成功. 如果没有安装JDK报错 ...
- python/数据库操作补充—模板—Session
python/数据库操作补充—模板—Session 一.创建一个app目录 在models.py只能类进行进行创建表 class Foo: xx= 字段(数据库数据类型) 字段类型 字符串 Email ...