题目链接

https://www.luogu.org/problemnew/show/P2502

分析

一个很\(naive\)的做法是从\(s\)到\(t\)双向BFS这当然会TLE

这时我就有个想法就是二分套二分边下标来求得一个比值,同时排序后从小到大枚举每一条边作为最小值,同时再枚举每一条边,如果边权之比小于比值就连起来用并查集维护连通性,可是这个时间复杂度\(O(m^2 log^2m \ \alpha(n))\)过不去QAQ

然后想为什么不直接枚举每条边作为最小值,同时搞一颗以这条边为最小值且联通s,t的最小生成树呢,因为边是排序好的,这样答案是单调的,且正确性是显然的时间复杂度\(O(m^2)\).

代码

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <cctype>
#include <cmath>
#define ll long long
#define ri register int
using std::sort;
using std::min;
using std::max;
using std::swap;
template <class T>inline void read(T &x){
x=0;int ne=0;char c;
while(!isdigit(c=getchar()))ne=c=='-';
x=c-48;
while(isdigit(c=getchar()))x=(x<<3)+(x<<1)+c-48;
x=ne?-x:x;return ;
}
const int maxm=5005;
const int maxn=505;
const int inf=0x7fffffff;
struct Edge{
int x,y,dis;
bool operator <(const Edge &b)const{
return dis<b.dis;
}
}edge[maxm];
int num_edge=0;
int n,m,s,t;
int fa[maxn];
int get(int x){return fa[x]==x?fa[x]:(fa[x]=get(fa[x]));}
int gcd(int a,int b){
return b?gcd(b,a%b):a;
}
int main(){
int x,y,v,xx,yy;
bool flag=0;
read(n),read(m);
for(ri i=1;i<=m;i++){
read(x),read(y),read(v);
edge[i].x=x,edge[i].y=y,edge[i].dis=v;
}
read(s),read(t);
sort(edge+1,edge+1+m);
int mx,cnt=0;
double mi=inf;
int fz,fm;
for(ri i=1;i<=m;i++){
mx=-inf,flag=0;
for(ri j=1;j<=n;j++)fa[j]=j;
for(ri j=i;j<=m;j++){
x=edge[j].x,y=edge[j].y,v=edge[j].dis;
xx=get(x),yy=get(y);
if(xx==yy)continue;
fa[xx]=yy;
mx=max(mx,v);
if(get(s)==get(t)){
flag=1;break;
}//if(cnt==n-1)break;
}
if(i==1&&get(s)!=get(t)){
puts("IMPOSSIBLE");
return 0;
}
else if(flag){
double tmp=(double)mx/edge[i].dis;
//printf("%d %d %lf\n",mx,edge[i].dis,tmp);
if(tmp<mi){
flag=1;
mi=tmp;
fm=edge[i].dis,fz=mx;
}
}
}
int GCD=gcd(fz,fm);
fm=fm/GCD,fz=fz/GCD;
if(fm==1)printf("%d\n",fz);
else printf("%d/%d\n",fz,fm);
return 0;
}

luogu题解P2502[HAOI2006]旅行--最小生成树变式的更多相关文章

  1. P2502 [HAOI2006]旅行 最小生成树

    思路:枚举边集,最小生成树 提交:1次 题解:枚举最长边,添加较小边. #include<cstdio> #include<iostream> #include<algo ...

  2. P2502 [HAOI2006]旅行

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

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

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

  4. luogu P2502 [HAOI2006]旅行

    传送门 边数只有5000,可以考虑\(O(m^2)\)算法,即把所有边按边权升序排序,然后依次枚举每条边\(i\),从这条边开始依次加边,加到起点和终点在一个连通块为止.这个过程可以用并查集维护.那么 ...

  5. 洛谷P2502[HAOI2006]旅行

    题目: Z小镇是一个景色宜人的地方,吸引来自各地的观光客来此旅游观光.Z小镇附近共有N个景点(编号为1,2,3,-,N),这些景点被M条道路连接着,所有道路都是双向的,两个景点之间可能有多条道路.也许 ...

  6. P2502 [HAOI2006]旅行 并查集

    题目描述 Z小镇是一个景色宜人的地方,吸引来自各地的观光客来此旅游观光.Z小镇附近共有N个景点(编号为1,2,3,…,N),这些景点被M条道路连接着,所有道路都是双向的,两个景点之间可能有多条道路.也 ...

  7. luogu题解 P5022 【旅行】

    本人的代码可以说洛谷最简单的了 我的存图方式有些与众不同 a[5000][5000]中第一个下标表示第几个点,第二个表示与点相连的点 虽然比前向星废内存但时间极快,大概是O(n)的. 现在步入正题 6 ...

  8. [HAOI2006]旅行 题解(kruskal)

    [HAOI2006]旅行 Description Z小镇是一个景色宜人的地方,吸引来自各地的观光客来此旅游观光.Z小镇附近共有N个景点(编号为1,2,3,-,N),这些景点被M条道路连接着,所有道路都 ...

  9. BZOJ 1050 [HAOI2006]旅行comf

    1050: [HAOI2006]旅行comf Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1889  Solved: 976[Submit][Sta ...

随机推荐

  1. Qt DLL总结【二】-创建及调用QT的 DLL

    开发环境:VS2008+Qt4.7.4 最近看了不少Qt的DLL例子,总结一下如何创建和调用QT 动态链接库. 先讲一下对QT动态链接库的调用方法,主要包括: 1.显式链接DLL,调用DLL的全局函数 ...

  2. CentOS7 上搭建 CDH(6.3.0)

    这里以四台节点搭建 IP HostName OS 192.168.8.5 h5(主) CentOS 7.5 192.168.8.6 h6(从) CentOS 7.5 192.168.8.7 h7(从) ...

  3. DNA Sorting

    DNA Sorting Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 105159   Accepted: 42124 De ...

  4. LC 820. Short Encoding of Words

    Given a list of words, we may encode it by writing a reference string S and a list of indexes A. For ...

  5. Tween(补间)动画

    视图动画,也叫Tween(补间)动画可以在一个视图容器内执行一系列简单变换(位置.大小.旋转.透明度).譬如,如果你有一个TextView对象,您可以移动.旋转.缩放.透明度设置其文本,当然,如果它有 ...

  6. linux安装sz、rz的方法,及安装zip

    Linux系统下安装rz/sz命令及使用说明   对于经常使用Linux系统的人员来说,少不了将本地的文件上传到服务器或者从服务器上下载文件到本地,rz / sz命令很方便的帮我们实现了这个功能,但是 ...

  7. JVM学习笔记之认识JDK(一)

    1. HotSpot VM: HotSpot VM是Sun JDK和OpenJDK中所带的虚拟机,也是目前使用范围最广的Java虚拟机. 什么是HotSpot VM & 深入理解Java虚拟机 ...

  8. MySQL数据库锁机制之MyISAM引擎表锁和InnoDB行锁详解

    转 http://blog.csdn.net/hsd2012/article/details/51112009 转 http://blog.csdn.net/e421083458/article/de ...

  9. 【并行计算-CUDA开发】CUDA存储器模型

    CUDA存储器模型 除了执行模型以外,CUDA也规定了存储器模型(如图2所示)和一系列用于主控CPU与GPU间通信的不同地址空间.图中红色的区域表示GPU片内的高速存储器,橙色区域表示DRAM中的的地 ...

  10. java面试指导2019-9-16(arraylist)

    ArrayList源码分析 System.arraycopy()和Arrays.copyOf()方法 通过上面源码我们发现这两个实现数组复制的方法被广泛使用而且很多地方都特别巧妙.比如下面add(in ...