题意:给订一张无向图,求一条S到T的路径,使得路径上的最大边权与最小边权的比值最小

题解:将边由小到大排序,暴力枚举最小边,然后借鉴Kruskal的思想,由小到大加入每一条大于初始边的边,检验S与T是否连通,若连通则更新答案,枚举下一条边。

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;const int MAXN=500+2;
const int MAXM=5000+2;
struct EDGE{int u,v,w;
}e[MAXM];
int N,M,S,T,f[MAXN],ans_max,ans_min;
bool flag;int gcd(int a,int b){ return !b?a:gcd(b,a%b);}bool cmp(EDGE a,EDGE b){ return a.w<b.w;}int Find(int x){ return x==f[x]?x:f[x]=Find(f[x]);}int main(){cin >> N >> M;for(int i=1;i<=M;i++) cin >> e[i].u >> e[i].v >> e[i].w;sort(e+1,e+M+1,cmp);cin >> S >> T;for(int i=1,j;i<=M;i++,flag=0){if(e[i].w==e[i-1].w) continue;for(j=1;j<=N;j++) f[j]=j;for(j=i;j<=M;j++){if(Find(e[j].u)!=Find(e[j].v)) f[Find(e[j].u)]=f[Find(e[j].v)];if(Find(S)==Find(T)){flag=1;break;}}if(flag && (i==1 || ans_max*e[i].w>e[j].w*ans_min)) ans_min=e[i].w,ans_max=e[j].w;}if(!ans_min) cout << "IMPOSSIBLE" << endl;else{int t=gcd(ans_max,ans_min);ans_max/=t,ans_min/=t;if(ans_min==1) cout << ans_max << endl;else cout << ans_max << "/" << ans_min << endl;}return 0;
}

View Code

转载于:https://www.cnblogs.com/WDZRMPCBIT/p/6476857.html

BZOJ1050 HAOI2006 旅行comf 生成树+枚举相关推荐

  1. BZOJ 1050: [HAOI2006]旅行comf(枚举+并查集)

    [HAOI2006]旅行comf Description 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000).给你两个顶点 ...

  2. bzoj1050: [HAOI2006]旅行comf

    题面在这里 题意: 给一个图,每条边有边权. 给一个s和t,如果s和t之间没有路径输出IMPOSSIBLE,否则输出路径上最大边和最小边的比值的最小值. 做法: 你把边从小到大排序.那么对于一个最小值 ...

  3. [bzoj1050 HAOI2006] 旅行comf (kruskal)

    传送门 Description 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000).给你两个顶点S和T,求 一条路径,使得 ...

  4. BZOJ1050 [HAOI2006]旅行comf

    题目描述: 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000).给你两个顶点S和T,求 一条路径,使得路径上最大边和最小边 ...

  5. bzoj1050 [HAOI2006]旅行comf(并查集)

    要求路径上最大边与最小边比值的最小值.我们知道,如果固定最小值,最大值越接近最小值,他们的比值越小.因此我们可以采用类似bzoj3454的方法,把所有边从小到大排序,枚举最小值,再枚举最大值,用并查集 ...

  6. BZOJ1050 [HAOI2006]旅行comf(Kruskal算法)

    SPFA是错误的:局部最优不能保证全局最优,因为要求的是比例最小,与路的长短无直接关系 可以设计m^2的算法: 先将边按长度排序,然后每次枚举最小边的长度w[i]作限定,依次加入更大的边, 当加到某条 ...

  7. bzoj1050 [HAOI2006]旅行comf

    题目 枚举最小边,在用kruskal方法来让S与T,联通,这样比值就最优了.. #include<bits/stdc++.h> using namespace std; int f[501 ...

  8. [BZOJ1050] [HAOI2006] 旅行comf (Kruskal, LCT)

    Description 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000).给你两个顶点S和T ,求一条路径,使得路径上最 ...

  9. BZOJ1050 [HAOI2006]旅行comf (并查集)

    题意分析 一开始想用最短路的方法维护,然后更新信息.失败了. 想了半天,发现跟lrj书上面的一道题很像,看边才5000,暴力可做. 对边排序后枚举sta,直到发现起点和重点在一个联通块里面,统计答案即 ...

最新文章

  1. 关于C++中数组下标越界不报错的问题
  2. JavaScript Office文档在线编辑备忘
  3. 返回动态html,使用硒返回动态页面的html代码
  4. 三星Galaxy S20:如何开启黑暗模式
  5. python分布式爬虫及数据存储_二十一 Python分布式爬虫打造搜索引擎Scrapy精讲—爬虫数据保存...
  6. [Java基础]并发修改异常
  7. Altera FPGA程序固化
  8. python和java哪个好-Python和Java发展前景哪个好?Python开发学习
  9. (重磅)最快的Hadoop完全分布式运行
  10. C++多线程map读写加锁
  11. 一种边播边下的播放策略
  12. CSND如何转载别人的文章
  13. ROS激光雷达小车自主导航学习(一)(持续更新中)
  14. Gitlab Code Review
  15. 编译原理(7):运行存储分配
  16. STM32F207ZG GPIO口学习
  17. setup界面的network configuration 进不去的原因
  18. 网站关键词排名怎么才能提高?
  19. 引入uni-app组件时报错:文件查找失败:‘@/compents/uni-popup.vue‘
  20. 应对安全漏洞:如何将LFI变为RFI

热门文章

  1. sfm-learner学习心得
  2. Java实现 LeetCode 319 灯泡开关
  3. 初学QT 实现简单游戏打地鼠
  4. 坚果云和百度网盘的比较
  5. 未分配虚拟网络-清理注册表
  6. win10如何关机时显示停止服务器,Win10系统关机时总提示此应用程序阻止关机如何解决...
  7. 高通平台msm8916修改开机logo 高通平台修改LK(bootloader)开机logo
  8. jquery.qrcode.js生成二维码
  9. STM32 阿里云MQTT esp8266 AT命令
  10. 翻译Guzzle摘要