要求路径上最大边与最小边比值的最小值。我们知道,如果固定最小值,最大值越接近最小值,他们的比值越小。因此我们可以采用类似bzoj3454的方法,把所有边从小到大排序,枚举最小值,再枚举最大值,用并查集维护,当s和t连通时,便是此最小值的最优答案。复杂度O(m2)O(m^2)

#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 505
#define M 5005
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();return x*f;
}
int n,m,fa[N],s,t,mx=1,mn=0;
struct data{int x,y,v;
}a[M];
inline bool cmp(data x,data y){return x.v<y.v;}
inline int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);}
inline void merge(int x,int y){int xx=find(x),yy=find(y);if(xx!=yy) fa[xx]=yy;
}
inline int gcd(int x,int y){return y==0?x:gcd(y,x%y);}
int main(){
//  freopen("a.in","r",stdin);n=read();m=read(); for(int i=1;i<=m;++i) a[i].x=read(),a[i].y=read(),a[i].v=read();s=read();t=read();std::sort(a+1,a+m+1,cmp);for(int i=1;i<=m;++i){if(a[i].v==a[i-1].v) continue;for(int ii=1;ii<=n;++ii) fa[ii]=ii;for(int j=i;j<=m;++j){merge(a[j].x,a[j].y);if(find(s)==find(t)){if(a[j].v*mn<a[i].v*mx) mn=a[i].v,mx=a[j].v;break;}}}if(mn*mx==0) puts("IMPOSSIBLE");else{int k=gcd(mx,mn);mx/=k;mn/=k;if(mn==1) printf("%d\n",mx);else printf("%d/%d\n",mx,mn);}return 0;
}

bzoj1050 [HAOI2006]旅行comf(并查集)相关推荐

  1. BZOJ 1050 [HAOI2006]旅行comf(并查集)

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

  2. HYSBZ - 1050(旅行comf 并查集Java实现)

    HYSBZ - 1050(旅行comf Java实现) 原题地址 解法:枚举每一条边,对于这条边,我们需要找到集合中和其值相差最小的最大边,这个集合是指与包括i边在内的ST联通集.对于这一要求,我们只 ...

  3. bzoj1050: [HAOI2006]旅行comf

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

  4. BZOJ1050 [HAOI2006]旅行comf

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

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

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

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

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

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

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

  8. bzoj1050 [HAOI2006]旅行comf

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

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

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

最新文章

  1. 创新驱动未来,浪潮持续深耕信息安全市场
  2. php setcookie 过期,php cookie怎么设置过期时间?
  3. Android Editable
  4. 支持多浏览器高拍仪开发控件
  5. Linux-完美解决linux系统镜像下载速度慢的问题
  6. 寻求 华中科大《机械控制工程基础》第五版习题参考答案
  7. 基于Qt的NAT检测和NAT穿透
  8. 链表实现一元多项式的加法、乘法、求导,求值
  9. 山西台达plc可编程控制器_PLC可编程控制器常见的应用领域
  10. PyQT股票看板软件界面设计
  11. 【附源码】计算机毕业设计SSM社区生鲜配送系统
  12. 【OneAPM】极客编程挑战#025:发挥想象生成漂亮炫酷的SVG动画效果
  13. MySQL中的表中增加删除字段
  14. STM32之SD卡【写的太好了 转载 】
  15. 干货分享:Totoro 在自动化测试领域的深耕与收获
  16. Javascript(jQuery)中绑定页面上所有按钮点击事件的几种方式
  17. 最大公约数的几种求解及代码实现
  18. 关于DataTable查询数据的几种方式
  19. python安装包下载太慢解决
  20. 3分钟判断SAP顾问水平

热门文章

  1. Mac 使用音频工具分析音频数据
  2. SendCloud从注册到邮件发送使用心得
  3. 68 个Python内置函数,你用过几个?
  4. es - elasticsearch - search - DSL - specialized - pinned
  5. 开始讨厌现在这种生活
  6. 安卓电子书格式_纯干货|提升电子书阅读体验的四点感受
  7. python_you-get下载B站视频详解
  8. 谷歌推出逐字搜索Verbatim
  9. [C++]判断齐次坐标系中三点是否共线(三个向量是否共面)
  10. java解析micaps_9210的Micaps第13类卫星云图数据