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. Java调用oracle存储过程通过游标返回临时表数据

    注:本文来源于 <  Java调用oracle存储过程通过游标返回临时表数据   > Java调用oracle存储过程通过游标返回临时表数据 项目开发过程中,不可避免的会用到存储过程返回结 ...

  2. 关于《common-net》的ftp上传

    1:jar的maven的引用: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http ...

  3. 在 Confluence 6 中禁用 workbox 应用通知

    如果你选择 不提供应用通知(does not provide in-app notifications): Confluence workbox 图标将不会可见同时用户也不能在这个服务器上访问 wor ...

  4. nginx实战(三)之静态资源web服务(跨站访问)

    语法 虽然说浏览器禁止跨站访问以防(CSRF),但出于一些原因还是要进行跨站访问,服务端通过设置头信息Access-Control-Allow-Orign:xxxx,客户端收到后就会允许跨站访问了 实 ...

  5. java多线程快速入门(二十一)

    CountDownLatch(闭锁)计数器 有一个任务A,它要等待其他4个任务执行完毕之后才执行,此时就可以利用CountDownLatch来实现这种功能 package com.cppdy; imp ...

  6. Nginx的进程模型及高可用方案(OpenResty)

    1. Nginx 进程模型简介 Nginx默认采用多进程工作方式,Nginx启动后,会运行一个master进程和多个worker进程.其中master充当整个进程组与用户的交互接口,同时对进程进行监护 ...

  7. 编辑方法分享之如何编辑PDF文件内容

    我们现在在工作中会经常使用到PDF文件,还会有遇到需要编辑PDF文件的时候,PDF文件的编辑问题一直是个大难题.很多朋友在面对PDF文件的时候束手无策,不知道该怎么对它进行编辑.下面小编就教给大家一个 ...

  8. java web----MINA框架使用

    前期准备 1.下载 http://mina.apache.org/ 2.将依赖包添加到工程目录下(在工程目录下创建libs(directory目录)) 3.将 slf4j-api-1.7.26.jar ...

  9. Java面向对象(二)

    一.封装 1.为什么要使用封装在类的外部直接操作类的属性是”不安全的"2.如何实现封装   1).属性私有化:设置属性的修饰符为private    2) .提供公共的set和get方法赋值 ...

  10. tinymce-vue富文本编辑器(翻译)

    官方Tinymce Vue组件 翻译来自:https://github.com/tinymce/tinymce-vue 官方文档:https://www.tiny.cloud/docs/general ...