题目描述:

给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000)。给你两个顶点S和T,求
一条路径,使得路径上最大边和最小边的比值最小。如果S和T之间没有路径,输出”IMPOSSIBLE”,否则输出这个
比值,如果需要,表示成一个既约分数。 备注: 两个顶点之间可能有多条路径。
题解:
我们想如何贪心。
既然要比值最小,那么我们找到尽量小的最大边和尽量大的最小边就行了。
那怎么找呢?
我们将每个边权排序,每次枚举最小边和最大边,并将其加入并查集,如果将起点和中点连在了同一个联通块中,就是符合答案的一组解了。
附上代码:
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,s,t,f[5001],flag,idx,cnt1,cnt2;
double ans=999999999.0;
struct Edge
{int l,r,v;
}a[5001];
bool cmp(const Edge &x,const Edge &y)
{return x.v<y.v;
}
int find(int p)
{if(f[p]!=p)f[p]=find(f[p]);return f[p];
}
void merge(int x,int y)
{int fx=find(x);int fy=find(y);if(fx!=fy)f[fx]=fy;
}
int gcd(int x,int y)
{if(x%y==0)return y;return gcd(y,x%y);
}
int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=m;i++)scanf("%d%d%d",&a[i].l,&a[i].r,&a[i].v);scanf("%d%d",&s,&t);sort(a+1,a+m+1,cmp);for(int i=1;i<=m;i++){flag=0;for(int j=1;j<=n;j++)f[j]=j;for(int j=i;j<=m;j++){merge(a[j].l,a[j].r);if(find(s)==find(t)){idx=j;flag=1;break;}}if(flag==1){if(ans>(a[idx].v*1.0)/a[i].v){ans=(a[idx].v*1.0)/a[i].v;cnt1=a[idx].v;cnt2=a[i].v;}}}if(ans==999999999.0){printf("IMPOSSIBLE");return 0;}int k=gcd(cnt1,cnt2);if(cnt2/k==1)printf("%d",cnt1/k);elseprintf("%d/%d",cnt1/k,cnt2/k);
}

转载于:https://www.cnblogs.com/jiangminghong/p/9843204.html

BZOJ1050 [HAOI2006]旅行comf相关推荐

  1. bzoj1050: [HAOI2006]旅行comf

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

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

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

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

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

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

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

  5. bzoj1050 [HAOI2006]旅行comf

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

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

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

  7. BZOJ1050 HAOI2006 旅行comf 生成树+枚举

    题意:给订一张无向图,求一条S到T的路径,使得路径上的最大边权与最小边权的比值最小 题解:将边由小到大排序,暴力枚举最小边,然后借鉴Kruskal的思想,由小到大加入每一条大于初始边的边,检验S与T是 ...

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

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

  9. 【bzoj1050】[HAOI2006]旅行comf

    1050: [HAOI2006]旅行comf Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 2813  Solved: 1534 [Submit][ ...

最新文章

  1. Git忽略已经被提交的文件
  2. MySQL基本语句——增、删、查、改
  3. 一起学设计模式-观察者模式
  4. css3 设置多列布局
  5. 【译】《Understanding ECMAScript6》- 第三章-Object
  6. YUI 的模块信息配置优先级关系梳理
  7. 河南王牌计算机专业,河南计算机专业实力突出的7所大学,郑大位列次席,榜首实至名归...
  8. wp_nav_menu($args)函数说明
  9. spring cloud config的bootstrap.yml与application.proterties的区别
  10. 【英语学习】【WOTD】trivial 释义/词源/示例
  11. tomcat配置SSL加密网站
  12. 详细讲解3DMAX导出插件-tiamo
  13. 怎么把excel表格内的数据导入数据库?
  14. Myeclipse8.5 最新注册码以使用方法(可以用到2015年!!!)
  15. pxe无盘服务器教程,Windows下架设PXE服务器的方法
  16. 十天学会单片机和c语言编程,十天学会单片机和C语言编程
  17. Python基础——isupper()方法和islower()方法
  18. TexWorks中添加拼写纠察
  19. 商科能读计算机专业吗,我本科读的计算机 想去新西兰留学可以换专业吗? 没分了跪求啊,...
  20. 给下拉框加上可输入查询特性-升级版本

热门文章

  1. NeuChar 平台使用及开发教程 索引
  2. SpringBoot2.0.3 + SpringSecurity5.0.6 + vue 前后端分离认证授权
  3. 南京邮电大学java程序设计作业在线编程第二次作业
  4. 定时任务调度框架实现总结
  5. salt-api安装与配置
  6. swift 雨燕 新手教程
  7. 【原创】Erlang 之 entop 使用问题
  8. structs2 result type介绍
  9. Zend Studio使用
  10. 企业如何对付DDoS***