【bzoj1050】 旅行comf
http://www.lydsy.com/JudgeOnline/problem.php?id=1050 (题目链接)
题意:给出一个无向图,求图中两点间某条路径使得最大权值除以最小权值的值最小
Solution
今天考试题,写了个萎的dijistra,30分。。。
正解是最小生成树(其实并不是最小)。我们想让路径中最大的边和最小的边相差尽可能小,也就是说将边按权值从小到大排序后,路径就是序列中连续的一段所组成的生成树。枚举生成树中最小的边,然后往树中加边。当s与t联通时就break,更新答案。复杂度m²。
代码:
// bzoj1050
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#define LL long long
#define inf 2147483640
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std;
inline LL getint() {int f,x=0;char ch=getchar();while (ch<='0' || ch>'9') {if (ch=='-') f=-1;else f=1;ch=getchar();}while (ch>='0' && ch<='9') {x=x*10+ch-'0';ch=getchar();}return x*f;
}const int maxn=5010;
struct edge {int u,v,w;}e[maxn];
int fa[maxn],n,m,s,t;bool cmp(edge a,edge b) {return a.w<b.w;
}
int gcd(int x,int y) {return x%y==0?y:gcd(y,x%y);
}
int find(int x) {return x==fa[x] ? x : fa[x]=find(fa[x]);
}
int main() {scanf("%d%d",&n,&m);for (int i=1;i<=m;i++) scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);sort(e+1,e+1+m,cmp);scanf("%d%d",&s,&t);int x1=-1,y1=-1;for (int i=1;i<=m;i++) {if (e[i].w==e[i-1].w) continue; //质的飞越,快的不只一点点for (int j=1;j<=n;j++) fa[j]=j;for (int j=i;j<=m;j++) {int r1=find(e[j].u),r2=find(e[j].v);if (r1!=r2) fa[r1]=r2;if (find(s)==find(t)) {if (y1==-1 || (double)x1/y1>(double)e[j].w/e[i].w) x1=e[j].w,y1=e[i].w;break;}}if (y1==-1) {printf("IMPOSSIBLE");return 0;}}int x=gcd(x1,y1);x1/=x,y1/=x;if (y1==1) printf("%d\n",x1);else printf("%d/%d\n",x1,y1);return 0;
}
【bzoj1050】 旅行comf相关推荐
- BZOJ1050 旅行comf(kruskal)
旅行comf 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000).给你两个顶点S和T,求一条路径,使得路径上最大边和最小边 ...
- BZOJ1050 旅行comf
标签:最小生成树,并查集 Description 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000).给你两个顶点S和T, ...
- 【bzoj1050】[HAOI2006]旅行comf
1050: [HAOI2006]旅行comf Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2813 Solved: 1534 [Submit][ ...
- BZOJ 1050: [HAOI2006]旅行comf(枚举+并查集)
[HAOI2006]旅行comf Description 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000).给你两个顶点 ...
- HYSBZ - 1050(旅行comf 并查集Java实现)
HYSBZ - 1050(旅行comf Java实现) 原题地址 解法:枚举每一条边,对于这条边,我们需要找到集合中和其值相差最小的最大边,这个集合是指与包括i边在内的ST联通集.对于这一要求,我们只 ...
- bzoj 1050: [HAOI2006]旅行comf(尺取+最短路)
1050: [HAOI2006]旅行comf Time Limit: 10 Sec Memory Limit: 162 MB Submit: 3335 Solved: 1852 [Submit][ ...
- 【BZOJ 1050】旅行comf
[题目] 题目传送门旅行comf Description 给你一个无向图,( ≤ 500)个顶点, ( ≤ 5000)条边,每条边有一个权值 ( < 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 Description 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000). ...
- BZOJ 1050 HAOI2006 旅行comf
1050: [HAOI2006]旅行comf Time Limit: 10 Sec Memory Limit: 162 MB Submit: 3715 Solved: 2070 [Submit][ ...
最新文章
- [CF 392 Div.1 D]Three Arrays
- Windows 2008 ×××与 CA
- 使用LVS+TUN搭建集群实现负载均衡
- Android 学习笔记 BroadcastReceiver广播...
- defunct 进程占用端口_UAV心跳机制与容器、进程数据采集
- shutil模块、json和pickle模块
- ​CVPR2021最佳学生论文提名:Less is More
- 今晚直播丨2020年全国首场12c OCM直考揭秘
- 一次函数的斜率公式_【海广教育数学口诀】初中数学学不会?公式这样记,让你做题效率翻倍!...
- mysql 视图报错_MySQL使用Union创建视图报错
- vi/Vim的快速使用
- oracle会计事件,新的一年打开会计期发生错误
- C++解析(3):布尔类型与三目运算符
- java不能变成class_java.lang.Class不能转换为java.lang.reflect.ParameterizedType
- 一个门外汉的产品设计漫谈
- 基于Arduino的智能小车-代码部分
- ADC芯片——AD7705最详细讲解(STM32)
- 搜狗快照批量更新工具
- 如何稳定eBay店铺评分
- 电驴 链接不到服务器
热门文章
- 我们怎样才能过好这一生?
- Android5.0,IDA远程调试 The debugger could not attach to the selected process. irs_recv 等待的操作过时
- 就业和工作?毕业生何去何从?
- 论文学习笔记——弱监督语义分割(Learning Integral Objects with Intra-Class Discriminator for Weakly-Supervised Sema)
- 计算机网络的基础学习
- 树莓派用root登陆_树莓派开启root用户权限
- Discom BKS03/KS91D传感器
- gitlab修改项目名称
- RuntimeError: generator raised StopIteration
- 6.1 Verbatim环境