[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² ) 枚举边 , 利用并查集维护连通信息. ------------------------------------------------------------ ...
随机推荐
- Flask-uploads 简单使用
pip install flask-uploads#先导入次此处需要用到的库: from flask_uploads import UploadSet, IMAGES, configure_uploa ...
- Packet for query is too large (84 > -1).
windows下的resin配置连接mysql,常用的安全的做法是将数据库信息配置到conf目录下的resin.xml文件中. 因为resin连接mysql不是必须的,所以resin本身没有提供mys ...
- python 编码规范整理
PEP8 Python 编码规范 一 代码编排1 缩进.4个空格的缩进(编辑器都可以完成此功能),不要使用Tap,更不能混合使用Tap和空格.2 每行最大长度79,换行可以使用反斜杠,最好使用圆括号. ...
- 从PRISM开始学WPF(九)交互(完结)
0x07交互 Notification xaml: <Window x:Class="UsingPopupWindowAction.Views.MainWindow" xml ...
- Python内置函数(37)——sorted
英文文档: sorted(iterable[, key][, reverse]) Return a new sorted list from the items in iterable. Has tw ...
- dubbo debug过程中一个有趣的问题
最近在debug dubbo代码过程中遇到的很有趣的问题 我们都知道dubbo ReferenceBean是消费者的spring bean包装,为了查一个consumer端的问题,在Reference ...
- SpringCloud的应用发布(一)SpringCloud的样例工程
前言 这个综合例子创建了 6个微服务应用 一个服务注册中心 SvcReg(EurekaServer),生产中要考虑高可用 一个配置中心 CfgMgr + git目录存储配置(ConfigServer, ...
- redis入门(14)redis集群下的数据分区存储
redis入门(10)redis集群下的数据分区存储
- Linux上 ps 命令的用法
ps a 显示现行终端机下的所有程序,包括其他用户的程序.2)ps -A 显示所有程序. 3)ps c 列出程序时,显示每个程序真正的指令名称,而不包含路径,参数或常驻服务的标示. 4)ps -e 此 ...
- Codeforces Round #436 (Div. 2) D. Make a Permutation!
http://codeforces.com/contest/864/problem/D 题意: 给出n和n个数(ai <= n),要求改变其中某些数,使得这n个数为1到n的一个排列,首先保证修改 ...