由于此题边数比较小,所以可以先给边排个序,然后跑m遍最小生成树,每跑一次删除一条边,找最优解。

  • 防TLE技巧

把边按从小到大的顺序排好,那么只要当前无法联通,那么后面也无法联通

  • 最优解找法
  1. double tmp=(1.0*e[i].w)/(1.0*e[j].w);
  2. //因为边是有序的,所以当前的第一条边是最大的,保证能联通的最后一条边就是最小的(详细的自己理解)
  3. if(tmp<ans) a=e[i].w,b=e[j].w,ans=tmp;
  4. //与当前的最优解进行比较
  • 分数的处理技巧

设a和b是最后的结果,那么当b能整除a时,直接输出商

否则就求一遍最大公约数,把a与b分别除以这个最大公约数,输出结果

代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int MAXN=500+10;
  4. const int MAXM=5000+10;
  5. int n,m,s,t;
  6. struct Node
  7. {
  8. int u,v,w;
  9. }edge[MAXM];
  10. int f[MAXN];
  11. int ans1,ans2;
  12. inline int find(int k)
  13. {
  14. if(f[k]==k)return k;
  15. else return f[k]=find(f[k]);
  16. }
  17. inline bool cmp(Node u,Node v)
  18. {
  19. return u.w<v.w;
  20. }
  21. inline void init()//每次的并查集初始化
  22. {
  23. for(int i=1;i<=n;i++)f[i]=i;
  24. }
  25. inline int read()
  26. {
  27. int tot=0,f=1;
  28. char c=getchar();
  29. while(c<'0'||c>'9')
  30. {
  31. if(c=='-')f=-1;
  32. c=getchar();
  33. }
  34. while(c>='0'&&c<='9')
  35. {
  36. tot=tot*10+c-'0';
  37. c=getchar();
  38. }
  39. return tot*f;
  40. }
  41. inline int gcd(int x,int y)//求最大公约数
  42. {
  43. if(y>x)return gcd(y,x);
  44. if(y==0)return x;
  45. return gcd(y,x%y);
  46. }
  47. int main()
  48. {
  49. n=read();m=read();
  50. for(int i=1;i<=m;i++)
  51. {
  52. edge[i].u=read();
  53. edge[i].v=read();
  54. edge[i].w=read();
  55. }
  56. s=read();t=read();
  57. sort(edge+1,edge+1+m,cmp);
  58. int now;
  59. for(int i=1;i<=m;i++)
  60. {
  61. init();
  62. /*for(int i=1;i<=n;i++)cout<<f[i]<<" ";
  63. cout<<endl;*/
  64. for(now=i;now<=m;now++)
  65. {
  66. int fx=find(edge[now].u),fy=find(edge[now].v);
  67. //cout<<fx<<" "<<fy<<endl;
  68. if(fx==fy)continue;
  69. f[fx]=fy;
  70. if(find(s)==find(t))break;
  71. }
  72. /*for(int i=1;i<=n;i++)cout<<f[i]<<" ";
  73. cout<<endl;*/
  74. if(i==1&&find(s)!=find(t))
  75. {
  76. cout<<"IMPOSSIBLE\n";
  77. return 0;
  78. }
  79. if(find(s)!=find(t))break;
  80. if(ans1*edge[i].w>=ans2*edge[now].w)ans1=edge[now].w,ans2=edge[i].w;
  81. }
  82. //cout<<ans1<<" "<<ans2<<endl;
  83. if(ans2%ans1==0)
  84. {
  85. cout<<ans2/ans1<<endl;
  86. return 0;
  87. }
  88. int gcdd=gcd(ans1,ans2);
  89. cout<<ans1/gcdd<<"/"<<ans2/gcdd<<endl;
  90. return 0;
  91. }

洛谷 题解 P2502 【[HAOI2006]旅行】的更多相关文章

  1. luogu题解P2502[HAOI2006]旅行--最小生成树变式

    题目链接 https://www.luogu.org/problemnew/show/P2502 分析 一个很\(naive\)的做法是从\(s\)到\(t\)双向BFS这当然会TLE 这时我就有个想 ...

  2. P2502 [HAOI2006]旅行——暴力和并查集的完美结合

    P2502 [HAOI2006]旅行 一定要看清题目数据范围再决定用什么算法,我只看着是一个蓝题就想到了记录最短路径+最小生成树,但是我被绕进去了: 看到只有5000的边,我们完全可以枚举最小边和最大 ...

  3. P2502 [HAOI2006]旅行

    P2502 [HAOI2006]旅行有些问题光靠直觉是不靠谱的,必须有简单的证明,要么就考虑到所有情况.这个题我想的是要么见最小生成树,要么建最大生成树,哎,我sb了一种很简单的情况就能卡掉在最小生成 ...

  4. 洛谷P2501 bzoj1049 [HAOI2006]数字序列

    题目链接 bzoj 洛谷 题解 第一问: 假如 \(i < j\) 如果 \(j\)能从\(i\)转移过来 显然中间空隙必须足够 例如:\(50\) \(53\) \(53\) \(52\) 就 ...

  5. 洛谷P1027 Car的旅行路线

    洛谷P1027 Car的旅行路线 题目描述 又到暑假了,住在城市A的Car想和朋友一起去城市B旅游.她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一条笔直的高速 ...

  6. DP【洛谷P2134】 百日旅行

    [洛谷P2134] 百日旅行 题目背景 重要的不是去哪里,而是和你在一起.--小红 对小明和小红来说,2014年7月29日是一个美好的日子.这一天是他们相识100天的纪念日. (小明:小红,感谢你2场 ...

  7. 洛谷 题解 UVA572 【油田 Oil Deposits】

    这是我在洛谷上的第一篇题解!!!!!!!! 这个其实很简单的 我是一只卡在了结束条件这里所以一直听取WA声一片,详细解释代码里见 #include<iostream> #include&l ...

  8. 洛谷 题解 P1600 【天天爱跑步】 (NOIP2016)

    必须得说,这是一道难题(尤其对于我这样普及组205分的蒟蒻) 提交结果(NOIP2016 天天爱跑步): OJ名 编号 题目 状态 分数 总时间 内存 代码 / 答案文件 提交者 提交时间 Libre ...

  9. 洛谷题解P4314CPU监控--线段树

    题目链接 https://www.luogu.org/problemnew/show/P4314 https://www.lydsy.com/JudgeOnline/problem.php?id=30 ...

随机推荐

  1. HTTP权威指南与图解HTTP读书笔记

    目录 第1章 HTTP概述 1.1 Web客户端和服务器 1.2 资源 1.2.1 URI 1.2.2 URL 1.2.3 URN 1.3 事务 1.3.1 方法 1.3.2 状态码 1.3.3 We ...

  2. MongoDB 运维实总结

    一.MongoDB 集群简介 MongoDB是一个基于分布式文件存储的数据库,其目的在于为WEB应用提供可扩展的高性能数据存储解决方案.下面将以3台机器介绍最常见的集群方案.具体介绍,可以查看官网 h ...

  3. python 赋值魔法

    序列解包: >>> x,y,z = 1, 2, 3>>> print(x, y, z)1 2 3 >>> a,b, *reset = [1,2,3 ...

  4. AtCoder Beginner Contest 132

    目录 Contest Info Solutions A. Fifty-Fifty B. Ordinary Number C. Divide the Problems D. Blue and Red B ...

  5. c实现循环链表

    解决约瑟夫环问题核心步骤: 1.建立具有n个节点.无头的循环链表 2.确定第一个报数人的位置 3.不断从链表中删除链节点,直到链表为空 #include <iostream> #inclu ...

  6. C语言学习笔记11- 文件I/O

    C语言学习笔记11- 文件I/O  ..待编辑 文件操作(CRT.C++.WIN API.MFC)

  7. [shell]如何测试shell脚本,保证正确

    如何用最快最有效的方式进行测试? 很多开发的习惯是,二话不说,写完/拿到,就跑一把,看看输入,输出,想要的操作是否完成,也就过了. 其实这是十分不严谨的,若是未经过QA,风险还是相当大的. 以下即sh ...

  8. hive 调优(一)coding调优

    本人认为hive是很好的工具,目前支持mr,tez,spark执行引擎,有些大公司原来封装的sparksql,开发py脚本,但是目前hive支持spark引擎(不是很稳定,建议Tez先),所以离线还是 ...

  9. easyui的combobox模糊搜索

    <tr> <th>测试名称:</th> <td> <select data-options="" class="ea ...

  10. Embedded based learning

    简单整理了一些嵌入式底层需要接触的相关概念.   # CPU  CU. Control Unit. send need-clac-data -> ALU clac -> get resul ...