当前位置: 首页 > news >正文

1050. [HAOI2006]旅行【并查集+枚举】

Description

给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000)。给你两个顶点S和T,求
一条路径,使得路径上最大边和最小边的比值最小。如果S和T之间没有路径,输出”IMPOSSIBLE”,否则输出这个
比值,如果需要,表示成一个既约分数。 备注: 两个顶点之间可能有多条路径。

Input

第一行包含两个正整数,N和M。下来的M行每行包含三个正整数:x,y和v。表示景点x到景点y之间有一条双向公路
,车辆必须以速度v在该公路上行驶。最后一行包含两个正整数s,t,表示想知道从景点s到景点t最大最小速度比
最小的路径。s和t不可能相同。
1<N<=500,1<=x,y<=N,0<v<30000,0<M<=5000

Output

如果景点s到景点t没有路径,输出“IMPOSSIBLE”。否则输出一个数,表示最小的速度比。
如果需要,输出一个既约分数。

Sample Input

【样例输入1】
4 2
1 2 1
3 4 2
1 4
【样例输入2】
3 3
1 2 10
1 2 5
2 3 8
1 3
【样例输入3】
3 2
1 2 2
2 3 4
1 3

Sample Output

【样例输出1】
IMPOSSIBLE
【样例输出2】
5/4
【样例输出3】
2

一开始想了半天,结果到最后抄(划掉)观摩了一下题解才明白这个题用并查集+暴力枚举就可以过
跑的还蛮快的,最慢的点400ms+

 

 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 int n,m,i,j,father[1000],A,B,ansx,ansy,md,zz;
 5 struct node
 6 {
 7     int x;
 8     int y;
 9     int len;
10 } a[5010]; //保存边的信息,即两个端点和速度
11 int find(int x)
12 {
13     if (father[x]==x)    return x;
14     father[x]=find(father[x]);
15     return father[x];
16 }//并查集模板
17 void merge(int x,int y)
18 {
19     int f1=find(x);
20     int f2=find(y);
21     father[f1]=f2;
22 }//并查集模板
23 int gcd(int x,int y)
24 {
25     while (y!=0)
26     {
27         x=x%y;
28         swap(x,y);
29     }
30     return x;
31 }//求最大公约数,用于最后输出答案
32 bool cmp(node p,node q)
33 {
34     return p.len>q.len;
35 }
36 int main()
37 {
38     cin>>n>>m;
39     for (i=1; i<=m; ++i)
40         cin>>a[i].x>>a[i].y>>a[i].len;
41     cin>>A>>B;
42     sort(a+1,a+m+1,cmp);//先将边的大小从大到小排
43     ansx=0x7f;
44     ansy=1;//处置化最终结果
45     for (i=1; i<=m; ++i) //先i固定住最大距离
46     {
47         for (j=1; j<=n; ++j) //并查集初始化
48             father[j]=j;
49         for (j=i; j<=m; ++j) //再然后j枚举i后面的边找与i相差最小的速度
50         {
51             if (find(a[j].x)!=find(a[j].y))
52                 merge(a[j].x,a[j].y);//如果两个点不在一个并查集就合并。
53             if (find(A)==find(B))//从大到小一条一条接,直到接到起点和终点联通为止。
54             {
55                 md=a[i].len;
56                 zz=a[j].len;
57                 break;
58             }
59         }
60         if (md*1.0/zz<ansx*1.0/ansy)
61         {
62             ansx=md;
63             ansy=zz;
64         }
65     }
66     if (ansx==0x7f&&ansy==1)
67         cout<<"IMPOSSIBLE"<<endl;//如果最终答案没被更新过,就说明A和B不连通
68     else
69     {
70         int g=gcd(ansx,ansy);
71         ansx/=g;
72         ansy/=g;
73         if (ansy==1)//若分母为1则省略;
74             cout<<ansx<<endl;
75         else
76             cout<<ansx<<'/'<<ansy<<endl;
77     }
78 }

转载于:https://www.cnblogs.com/refun/p/8678597.html

相关文章:

  • HDU-1421
  • 2251. [2010Beijing Wc]外星联络【后缀数组】
  • Tortoisesvn,鼠标右键菜单中找不到“检出”的处理方法
  • 麻烦大家反馈一下昨天的网站访问速度
  • 网关 Spring-Cloud-Gateway 源码解析 —— 网关初始化
  • shell中quotes的不同作用
  • C/C++入门必备
  • SqlServer在表中插入数据时出现主键冲突问题解决方式
  • 1、告别windows,决定
  • 深入浅出Power Shell——cmd调用PowerShell脚本
  • 专访黄隽实:Stay hungry, Stay foolish!
  • golang中应该怎么使用socket?
  • 第十一课 xshell实现linux与windows互文件、用户与密码的配置文件、用户和用户组的管理...
  • ubuntu12.04+ssh远程登录
  • 生活在这个世界当中,就要学会去接受去应用,去感受。。。。。
  • Angularjs之国际化
  • Angular数据绑定机制
  • Git学习与使用心得(1)—— 初始化
  • gops —— Go 程序诊断分析工具
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • Java深入 - 深入理解Java集合
  • JS题目及答案整理
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • Meteor的表单提交:Form
  • Node项目之评分系统(二)- 数据库设计
  • Python3爬取英雄联盟英雄皮肤大图
  • Python学习之路13-记分
  • Rancher如何对接Ceph-RBD块存储
  • 笨办法学C 练习34:动态数组
  • 多线程 start 和 run 方法到底有什么区别?
  • 服务器之间,相同帐号,实现免密钥登录
  • 关于springcloud Gateway中的限流
  • 解决iview多表头动态更改列元素发生的错误
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 前端代码风格自动化系列(二)之Commitlint
  • 前言-如何学习区块链
  • 少走弯路,给Java 1~5 年程序员的建议
  • 深度学习在携程攻略社区的应用
  • 世界上最简单的无等待算法(getAndIncrement)
  • 我感觉这是史上最牛的防sql注入方法类
  • 一个JAVA程序员成长之路分享
  • 再谈express与koa的对比
  • Java性能优化之JVM GC(垃圾回收机制)
  • ​什么是bug?bug的源头在哪里?
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (转载)hibernate缓存
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .libPaths()设置包加载目录
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。
  • .net MVC中使用angularJs刷新页面数据列表
  • .NET 中 GetProcess 相关方法的性能
  • .Net下的签名与混淆