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+

 #include<iostream>
#include<algorithm>
using namespace std;
int n,m,i,j,father[],A,B,ansx,ansy,md,zz;
struct node
{
int x;
int y;
int len;
} a[]; //保存边的信息,即两个端点和速度
int find(int x)
{
if (father[x]==x) return x;
father[x]=find(father[x]);
return father[x];
}//并查集模板
void merge(int x,int y)
{
int f1=find(x);
int f2=find(y);
father[f1]=f2;
}//并查集模板
int gcd(int x,int y)
{
while (y!=)
{
x=x%y;
swap(x,y);
}
return x;
}//求最大公约数,用于最后输出答案
bool cmp(node p,node q)
{
return p.len>q.len;
}
int main()
{
cin>>n>>m;
for (i=; i<=m; ++i)
cin>>a[i].x>>a[i].y>>a[i].len;
cin>>A>>B;
sort(a+,a+m+,cmp);//先将边的大小从大到小排
ansx=0x7f;
ansy=;//处置化最终结果
for (i=; i<=m; ++i) //先i固定住最大距离
{
for (j=; j<=n; ++j) //并查集初始化
father[j]=j;
for (j=i; j<=m; ++j) //再然后j枚举i后面的边找与i相差最小的速度
{
if (find(a[j].x)!=find(a[j].y))
merge(a[j].x,a[j].y);//如果两个点不在一个并查集就合并。
if (find(A)==find(B))//从大到小一条一条接,直到接到起点和终点联通为止。
{
md=a[i].len;
zz=a[j].len;
break;
}
}
if (md*1.0/zz<ansx*1.0/ansy)
{
ansx=md;
ansy=zz;
}
}
if (ansx==0x7f&&ansy==)
cout<<"IMPOSSIBLE"<<endl;//如果最终答案没被更新过,就说明A和B不连通
else
{
int g=gcd(ansx,ansy);
ansx/=g;
ansy/=g;
if (ansy==)//若分母为1则省略;
cout<<ansx<<endl;
else
cout<<ansx<<'/'<<ansy<<endl;
}
}

最新文章

  1. 初学C#和MVC的一些心得,弯路,总结,还有教训(3)--Dapper
  2. Oracle子查询(嵌套查询)
  3. Linux命令之exit - 退出当前shell【返回值状态】
  4. 用视频编辑软件打不开jpg格式的图片的解决方法
  5. select into from 和 insert into select 的用法和区别
  6. Linux安装VritualBox实现虚拟机win2003端口映射 支持远程
  7. Codeforces Round #273 (Div. 2)
  8. HeadFirst设计模式
  9. 查看mysql数据库表大小和最后修改时间
  10. 双向循环链表(C语言描述)(五)
  11. sublime text3添加右键打开的操作
  12. 夏令营讲课内容整理 Day 3.
  13. Java导出freemarker实现下载word文档格式功能
  14. IEEE signal processing letters 投稿经验
  15. ipfs上传下载
  16. Salesforce的站点和社区
  17. 12、利用docker快速搭建Wordpress网站
  18. 正向代理与反向代理区别图解 (nginx)
  19. Pearls in a Row CodeForces 620C 水题
  20. Unix 网络编程 读书笔记3

热门文章

  1. 数据库导出Excel(转载)
  2. Java中反射和Unsafe破坏单例设计模式
  3. Code Signal_练习题_isLucky
  4. PHP IN_ARRAY 函数 使用需要注意的地方
  5. JS基础(四)之jQuery
  6. 【MUI框架】学习笔记整理 Day 1
  7. 前端 ajax 获取后台json数据 解析
  8. FineReport中如何用JavaScript解决控件值刷新不及时
  9. 那些年vue踩过的坑
  10. Storm默认配置 default.yaml