P2502 [HAOI2006]旅行
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]旅行的更多相关文章
- P2502 [HAOI2006]旅行——暴力和并查集的完美结合
P2502 [HAOI2006]旅行 一定要看清题目数据范围再决定用什么算法,我只看着是一个蓝题就想到了记录最短路径+最小生成树,但是我被绕进去了: 看到只有5000的边,我们完全可以枚举最小边和最大 ...
- 洛谷P2502[HAOI2006]旅行
题目: Z小镇是一个景色宜人的地方,吸引来自各地的观光客来此旅游观光.Z小镇附近共有N个景点(编号为1,2,3,-,N),这些景点被M条道路连接着,所有道路都是双向的,两个景点之间可能有多条道路.也许 ...
- luogu题解P2502[HAOI2006]旅行--最小生成树变式
题目链接 https://www.luogu.org/problemnew/show/P2502 分析 一个很\(naive\)的做法是从\(s\)到\(t\)双向BFS这当然会TLE 这时我就有个想 ...
- luogu P2502 [HAOI2006]旅行
传送门 边数只有5000,可以考虑\(O(m^2)\)算法,即把所有边按边权升序排序,然后依次枚举每条边\(i\),从这条边开始依次加边,加到起点和终点在一个连通块为止.这个过程可以用并查集维护.那么 ...
- P2502 [HAOI2006]旅行 并查集
题目描述 Z小镇是一个景色宜人的地方,吸引来自各地的观光客来此旅游观光.Z小镇附近共有N个景点(编号为1,2,3,…,N),这些景点被M条道路连接着,所有道路都是双向的,两个景点之间可能有多条道路.也 ...
- P2502 [HAOI2006]旅行 最小生成树
思路:枚举边集,最小生成树 提交:1次 题解:枚举最长边,添加较小边. #include<cstdio> #include<iostream> #include<algo ...
- BZOJ 1050 [HAOI2006]旅行comf
1050: [HAOI2006]旅行comf Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1889 Solved: 976[Submit][Sta ...
- BZOJ 1050: [HAOI2006]旅行comf( 并查集 )
将edge按权值排序 , O( m² ) 枚举边 , 利用并查集维护连通信息. ------------------------------------------------------------ ...
- 1050: [HAOI2006]旅行comf
1050: [HAOI2006]旅行comf Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1495 Solved: 737[Submit][Sta ...
随机推荐
- Java_oracle超出打开游标的最大数的原因和解决方案
第一步:核查Oracle数据库 的游标的最大数 处理超出打开游标的最大数异常(ORA-01000: maximum open cursors exceeded) ORA-01000_maximum_o ...
- Confluence 6 自定义默认空间内容
中文标题[自定义默认空间内容] Confluence 管理员 可以编辑用于创建主页和新站点的模板.默认的内容将会在新空间创建后的主页上显示出来.这个与站点空间,个人空间和空间蓝图的模板是不同的. 模板 ...
- numpy:dot与multiply
http://blog.csdn.net/iamzhangzhuping/article/details/52370241
- Redis的消息发布和订阅
Redis的消息发布和订阅 Author:SimpleWu GitHub-redis 什么是消息发布和订阅? Redis 发布订阅(pub/sub)是一种进程间的消息通信模式: 发送者(pub)发送消 ...
- Redis简介与安装
目录 Redis概述与安装使用 Redis概述与安装使用 Author:SimpleWu GitHub-redis Redis简介 Redis英语全称:( REmote DIctionary Serv ...
- Layer-level的快速算法
十岁的小男孩 本文为终端移植的一个小章节. Sparse Block Net 本节为优化加速的第二章节,主要介绍Sparse-block net.上章节为OP算子层的加速,本节为层级间的加速,主要针对 ...
- html5页面调用手机打电话功能
<head>里面加上:<meta name="format-detection" content="telephone=yes"/> 需 ...
- 20165206 2017-2018-2《Java程序设计》课程总结
20165206 2017-2018-2<Java程序设计>课程总结 一.每周作业链接汇总 预备作业1:对师生关系的看法和期望 预备作业2:c语言基础和学习技能的理解 预备作业3:Linu ...
- 改变input type="file" 文字、样式等
<div class="tac"> <input type="file" id="browsefile" class=&q ...
- SQLServer 常见高CPU利用率原因
1.缺失索引: USE AdventureWorks2014 SET STATISTICS TIME ON; SET STATISTICS IO ON ; SELECT per.FirstName,p ...