bzoj 1050: [HAOI2006]旅行comf(并查集)
算法:并查集
难度:NOIP
题解:
将所有边权从小到大排序,正序枚举最小边,在以第i条边为最短边的情况下,枚举j(权值比i大的边),用并查集维护全图的连通性,如果s,t已经连通,并且做到可以更新答案,那么就可以break了,因为继续枚举j是没有意义的,计算出的答案一定比现在的答案大(因为我们之前把边权从小到大排序了!)。这样我们通过枚举以i为最短边,维护s,t连通性,完美的求出了最优解!
时间复杂度:
代码如下:
居然因为gcd敲错了调了30min<"????">
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#define ll long long
#define N 5005
using namespace std;
struct node
{int x,y,v;
}edg[N];
int cmp(node x,node y)
{return x.v<y.v;
}
int fa[N];
int findf(int x)
{if(x==fa[x]) return x;return fa[x]=findf(fa[x]);
}
int gcd(int a,int b){return b?gcd(b,a%b):a;}
int main()
{int n,m;scanf("%d%d",&n,&m);for(int i = 1;i <= m;i++){scanf("%d%d%d",&edg[i].x,&edg[i].y,&edg[i].v);}sort(edg+1,edg+1+m,cmp);int s,t,minn=0,maxn=0;double ans=999999999.0000;scanf("%d%d",&s,&t);for(int i = 1;i <= m;i++){for(int j = 1;j <= n;j++){fa[j]=j;}for(int j = i;j <= m;j++){int t1=findf(edg[j].x);int t2=findf(edg[j].y);if(t1!=t2){fa[t1]=t2;}if(findf(s)==findf(t)){if((double)edg[j].v/edg[i].v<ans){ans=(double)edg[j].v/edg[i].v;minn=edg[i].v;maxn=edg[j].v;break; }}}}if(!maxn) puts("IMPOSSIBLE");else {int gd=gcd(minn,maxn);if(minn/gd!=1) printf("%d/%d",maxn/gd,minn/gd);else printf("%d\n",maxn/gd);}return 0 ;
}
bzoj 1050: [HAOI2006]旅行comf(并查集)相关推荐
- BZOJ 1050 [HAOI2006]旅行comf(并查集)
1050: [HAOI2006]旅行comf Description 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000). ...
- [并查集]BZOJ 1050——[HAOI2006]旅行comf
1050: [HAOI2006]旅行comf 题目描述 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000).给你两个顶点S ...
- bzoj 1050: [HAOI2006]旅行comf(尺取+最短路)
1050: [HAOI2006]旅行comf Time Limit: 10 Sec Memory Limit: 162 MB Submit: 3335 Solved: 1852 [Submit][ ...
- BZOJ 1050 HAOI2006 旅行comf
1050: [HAOI2006]旅行comf Time Limit: 10 Sec Memory Limit: 162 MB Submit: 3715 Solved: 2070 [Submit][ ...
- bzoj 1050: [HAOI2006]旅行comf(codevs.cn 1001 舒适的路线) 快排+并查集乱搞
没用的话:好像很久没发博客了,主要是懒太蒟找不到水题.我绝对没弃坑...^_^ 还用些话:本文为博主原创文章,若转载请注明原网址和作者. 进入正题: 先pa网址: bzoj :http://www.l ...
- bzoj1050 [HAOI2006]旅行comf(并查集)
要求路径上最大边与最小边比值的最小值.我们知道,如果固定最小值,最大值越接近最小值,他们的比值越小.因此我们可以采用类似bzoj3454的方法,把所有边从小到大排序,枚举最小值,再枚举最大值,用并查集 ...
- BZOJ 1050 [HAOI2006]旅行comf(最小生成树)
题意 第一行包含两个正整数,N和M.下来的M行每行包含三个正整数:x,y和v.表示景点x到景点y之间有一条双向公路 ,车辆必须以速度v在该公路上行驶.最后一行包含两个正整数s,t,表示想知道从景点s到 ...
- BZOJ 1050: [HAOI2006]旅行comf
Time Limit: 10 Sec Memory Limit: 162 MB Submit: 3380 Solved: 1877 Description 给你一个无向图,N(N<=500)个顶 ...
- HYSBZ - 1050(旅行comf 并查集Java实现)
HYSBZ - 1050(旅行comf Java实现) 原题地址 解法:枚举每一条边,对于这条边,我们需要找到集合中和其值相差最小的最大边,这个集合是指与包括i边在内的ST联通集.对于这一要求,我们只 ...
最新文章
- c++一些常见的知识点
- 畅捷通携手易后台,专注小微企业财税服务
- 支付宝支付 第四集:配置类的定义和注入
- VC++ 2012 单元测试入门
- 计算机c盘d盘不显示了怎么办,我的电脑打开里头的C盘D盘的图标怎么显示不了啊......
- 持续集成工具jenkins的部署--Windows篇
- android开源系统brvah,Android Jetpack之通用Adapter(Databinding+BRVAH)
- 计组之指令系统:1、指令系统概述(定义、分类、格式、扩展操作码指令格式)
- FireBug调试工具笔记
- C语言课后习题(30)
- 解析WeNet云端推理部署代码
- wap移动网页开发rem用法
- 酷炫好玩又实用 | 可能是CES上六个最值得买的电子产品
- 数据挖掘与数据分析好书推荐
- Ubuntu 16.04.4 LTS下安装JDK
- RabbitMQ-C客户端使用说明
- jacob调用word宏
- 全球与中国烧碱片市场深度研究分析报告
- pdf加页码java_Java 添加页码到PDF文档
- C#中包含英文月份的美式日期输出格式