[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² ) 枚举边 , 利用并查集维护连通信息. ------------------------------------------------------------ ...
随机推荐
- 第十条:始终要覆盖toString()方法
Object类提供的toString()方法如下: public String toString() { return getClass().getName() + "@" ...
- Struts2之Struts2的下载与安装
Struts2的下载 登陆struts的官网 下载Full Distribution这个选项的struts2的包. 这是Struts2的完整版,里面包括Struts2的实例应用,空实例应用,核心库,源 ...
- [Cerc2013]Magical GCD
https://vjudge.net/problem/UVA-1642 题意:在一个序列中,找出一段连续的序列,使得长度*gcd最大 固定右端点,当左端点从左向右移动时,gcd不变或变大 gcd相同时 ...
- v7000数据恢复_MDisk重建数据恢复方法(北亚数据恢复)
很多工程师都有这样的疑问,MDisk重建后还能不能恢复数据呢?应该怎么做才能恢复数据呢?本文这里就以IBM V7000存储为例,详细讲解因为某个MDisk被重建导致的数据丢失的恢复方法.我们本案例中的 ...
- Solr搜索引擎搭建详细过程
1 什么是solr Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器.Solr可以独立运行在Jetty.Tomcat等这些Servlet容器中 ...
- Spring+Hibernate+Struts(SSH)框架整合
SSH框架整合 前言:有人说,现在还是流行主流框架,SSM都出来很久了,更不要说SSH.我不以为然.现在许多公司所用的老项目还是ssh,如果改成流行框架,需要成本.比如金融IT这一块,数据库dao层还 ...
- 新概念英语(1-113)Small Change
Lesson 113 Small Change 零钱 Listen to the tape then answer this question. Who has got some change?听录音 ...
- Angular 学习笔记 ( CDK - Observers )
<div class="projected-content-wrapper" (cdkObserveContent)="projectContentChanged( ...
- Python学习之list有序集合
# coding=utf-8 # list有序集合 classmate = ['Michael', 'Bob', 'Tracy'] print classmate print len(classmat ...
- Django:(博客系统)使用使用mysql数据&创建post/category/tag实体,并同步到数据中
背景: 之前也读过一些关于django的一些书,看过别人写的一些博客系统.但是总有一种看别人的都会,但自己写不出来的感觉,于是为了加深对django的学习就开始动手学习了. 环境搭建: 环境:使用py ...