P2502 [HAOI2006]旅行
有些问题光靠直觉是不靠谱的,必须有简单的证明,要么就考虑到所有情况。
这个题我想的是要么见最小生成树,要么建最大生成树,哎,我sb了
一种很简单的情况就能卡掉
在最小生成树中,Min为a,它有重边,b比a大,而且b依然是Min,那么此时答案就会更优。
正解就是枚举每一个边(从大到小),然后加边,直到联通,不断更新答案
时间复杂度为O(m^2)

这是一开始的错误代码:

 #include<iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<cmath>
#include<ctime>
#include<set>
#include<map>
#include<stack>
#include<cstring>
#define inf 2147483647
#define ls rt<<1
#define rs rt<<1|1
#define lson ls,nl,mid,l,r
#define rson rs,mid+1,nr,l,r
#define N 100010
#define For(i,a,b) for(register long long i=a;i<=b;i++)
#define p(a) putchar(a)
#define g() getchar() using namespace std; long long n,m;
long long x,y,v;
long long s,t,Max,Min,cnt;
bool vis[];
long long ans[];
long long d[];
bool flag; struct node{
long long n;
long long v;
node *next;
}*e[]; struct kru{
long long l;
long long r;
long long v;
}E[]; void in(long long &x){
long long y=;
char c=g();x=;
while(c<''||c>''){
if(c=='-')y=-;
c=g();
}
while(c<=''&&c>=''){
x=(x<<)+(x<<)+c-'';c=g();
}
x*=y;
}
void o(long long x){
if(x<){
p('-');
x=-x;
}
if(x>)o(x/);
p(x%+'');
} bool cmp1(kru a,kru b){
return a.v<b.v;
} bool cmp2(kru a,kru b){
return a.v>b.v;
} void push(long long x,long long y,long long v){
node *p;
p=new node();
p->n=y;
p->v=v;
if(e[x]==NULL)
e[x]=p;
else{
p->next=e[x]->next;
e[x]->next=p;
}
} long long find(long long x){
if(d[x]==x)return x;
return d[x]=find(d[x]);
} void build1(){
For(i,,n)
d[i]=i;
For(i,,m){
long long t1=find(E[i].l);
long long t2=find(E[i].r);
if(d[t1]!=d[t2]){
d[t1]=t2;
}
}
} void build2(){
For(i,,n)
e[i]=NULL;
For(i,,m){
if(d[E[i].l]==d[E[i].r]){
push(E[i].l,E[i].r,E[i].v);
push(E[i].r,E[i].l,E[i].v);
}
}
} void dfs(long long now,long long Max,long long Min){
if(now==t){
For(i,,){
if(Max%i==&&Min%i==){
Max/=i;
Min/=i;
}
}
ans[++cnt]=Max;ans[++cnt]=Min;
flag=true;
return;
}
for(register node *i=e[now];i;i=i->next){
if(!vis[i->n]){
vis[i->n]=true;
dfs(i->n,max(Max,i->v),min(Min,i->v));
vis[i->n]=false;
}
if(flag)return;
}
} int main(){
in(n);in(m);
For(i,,m){
in(x);in(y);in(v);
E[i].l=x;
E[i].r=y;
E[i].v=v;
}
in(s);in(t);
//跑最小生成树
sort(E+,E+m+,cmp1);
build1();
For(i,,n)
d[i]=find(d[i]);
if(d[s]!=d[t]){
cout<<"IMPOSSIBLE";
return ;
}
build2();
flag=false;
dfs(s,-inf,inf); sort(E+,E+m+,cmp2);
build1();
For(i,,n)
d[i]=find(d[i]);
build2();
For(i,,n)
vis[i]=false;
flag=false;
dfs(s,-inf,inf);
// For(i,1,cnt){
// o(ans[i]);p('\n');
// } if(cnt==||double(ans[])/double(ans[])<=double(ans[])/double(ans[])){
if(ans[]%ans[]==)
o(ans[]/ans[]);
else
cout<<ans[]<<"/"<<ans[];
}
else
if(ans[]%ans[]==)
o(ans[]/ans[]);
else
cout<<ans[]<<"/"<<ans[];
return ;
}

对了30分

正解:

 #include<iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<cmath>
#include<ctime>
#include<set>
#include<map>
#include<stack>
#include<cstring>
#define inf 2147483647
#define ls rt<<1
#define rs rt<<1|1
#define lson ls,nl,mid,l,r
#define rson rs,mid+1,nr,l,r
#define N 100010
#define For(i,a,b) for(register int i=a;i<=b;i++)
#define p(a) putchar(a)
#define g() getchar() using namespace std;
int n,m;
int d[];
int l,r,v;
int s,t;
int x,y,z;
struct kru{
int l;
int r;
int v;
bool operator < (const kru &temp)const{
return v>temp.v;
}
}e[]; void in(int &x){
int y=;
char c=g();x=;
while(c<''||c>''){
if(c=='-')y=-;
c=g();
}
while(c<=''&&c>=''){
x=(x<<)+(x<<)+c-'';c=g();
}
x*=y;
}
void o(int x){
if(x<){
p('-');
x=-x;
}
if(x>)o(x/);
p(x%+'');
} int find(int x){
if(d[x]==x)return x;
return d[x]=find(d[x]);
} int gcd(int x,int y){
return y==?x:gcd(y,x%y);
} int main(){
in(n);in(m);
For(i,,m){
in(l);in(r);in(v);
e[i].l=l;e[i].r=r;e[i].v=v;
}
in(s);in(t);
x=inf;y=; sort(e+,e+m+); For(i,,m){ For(ii,,n)
d[ii]=ii; For(j,i,m){ int t1=find(e[j].l);
int t2=find(e[j].r);
if(t1!=t2)
d[t1]=t2;
// For(k,1,n)
// d[k]=find(d[k]);
if(find(s)==find(t)){
if(double(e[i].v)/double(e[j].v)<double(x)/double(y)){
// cout<<double(e[i].v)/double(e[j].v)<<endl;
x=e[i].v;y=e[j].v;
}
break;
}
}
}
if(x/y==inf){
cout<<"IMPOSSIBLE";
return ;
}
z=gcd(x,y);
x/=z;y/=z;
if(x%y==)
o(x/y);
else
cout<<x<<"/"<<y;
return ;
}

P2502 [HAOI2006]旅行的更多相关文章

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

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

  2. 洛谷P2502[HAOI2006]旅行

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

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

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

  4. luogu P2502 [HAOI2006]旅行

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

  5. P2502 [HAOI2006]旅行 并查集

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

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

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

  7. BZOJ 1050 [HAOI2006]旅行comf

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

  8. BZOJ 1050: [HAOI2006]旅行comf( 并查集 )

    将edge按权值排序 , O( m² ) 枚举边 , 利用并查集维护连通信息. ------------------------------------------------------------ ...

  9. 1050: [HAOI2006]旅行comf

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

随机推荐

  1. 使用 Jira 和 Confluence 6 在一起

    这个过程是有趣的过程.请参考 Use Jira applications and Confluence together 文档来找到有关整合的相关内容,能够在后续的开发中更多的节省时间,以及你需要安装 ...

  2. 图片文字css小知识点

    行内元素,图片和文字中间有缝隙,需要给父元素设置font-size:0: 图片和文字不对齐,给图片设置vertical-align:top 文字行高有缝隙 设置vertical-align:top  

  3. AppServ安装到一半卡住的问题

    今天在笔记本安装AppServ的时候,运行到Installing mysql service时就卡住不动了,因为之前在自己的台式电脑安装过AppServ,当时是一步成功的,所以觉得这个问题莫名其妙,因 ...

  4. 眼底血管分割训练函数(SVM,Adaboost)

    # -*- coding: utf-8 -*- import numpy as np from sklearn import svm from sklearn.model_selection impo ...

  5. Python语音识别(计算器)

    第一步关于导入模块的事,我试了好几个方法才发现在好像win7系统没有语音识别功能,我用了win10的又需要重新下载一个包 这样子,win32com.client模块就可以使用了 import win3 ...

  6. 目标检测算法之R-CNN算法详解

    R-CNN全称为Region-CNN,它可以说是第一个成功地将深度学习应用到目标检测上的算法.后面提到的Fast R-CNN.Faster R-CNN全部都是建立在R-CNN的基础上的. 传统目标检测 ...

  7. C#接口和泛型类

    1.定义: 定义为一个约束,实现接口的类或者结构必须遵守该约定.借口是类之间交互的一个协议.定义了类之间的交互标准. 接口是类之间相互交互的一个抽象,把类之间需要交互的内容抽象出来定义成接口. 接口只 ...

  8. [转] Webpack-CommonsChunkPlugin

    当前项目结构   项目结构 其中 Greeter.js 引用了 config.json main.js 和 second.js 都引用了 Greeter.js main.js 还引用了 onlyfor ...

  9. opencv图片坐标和数组坐标

    图片坐标和数组坐标是相反的,坐标原点位于左上角 import numpy as np import cv2 height, width = 150, 200 img = np.zeros((heigh ...

  10. FORM表单中onclick()、submit()与onsubmit()的问题

    最近遇到一次处理form数据的过滤,采用了button的onclick事件来检查,发现return false后表单仍然提交了. 于是仔细研究了下onclick.onsubmit.submit集合函数 ...