题意:交互题,给定一个简单无向图和$A,B(1\leq A\lt B)$,你可以对每条边指定其边权为$A$或$B$后通过交互库询问$S\rightarrow T$的最短路($S,T$在程序运行之前已经确定),但你不知道$S,T$,现在要求$S$和$T$

无论是什么做法,我们首先需要知道边权为$1$时的最短路$dis$,在开始时把所有边设为$A$,调用一次即可

从部分分入手,第一个部分分(subtask1,2):图是一棵树,已知根是$S$,求$T$

因为只能调用很少次交互库,所以考虑二分

我们在bfs序上二分,假设当前二分到$[l,r]$,我们要检查$T$的bfs序是否在$[l,mid]$中,如果我们将bfs序在$[1,mid]$中的点的祖先边全部设为$A$,将其他边设为$B$,并且此时最短路为$dis\cdot A$,那么显然$T$的bfs序在$[l,mid]$中(因为任何bfs序在$[mid+1,r]$中的节点到根至少经过一条$B$边),于是时间复杂度为$O(n\log n)$,调用次数为$1+\left\lceil\log_2n\right\rceil$

然后是第二个部分分(subtask3,4):图是一棵树

如果我们能找出一条在$S\rightarrow T$最短路上的边,那么删掉这条边后对两棵树套用上面的算法即可

要找到任意一条这样的边,还是得二分,二分边的编号,二分到$[l,r]$时把$[1,mid]$的边设为$B$,把$[mid+1,n-1]$的边设为$A$,如果最短路没有变化,那么这条边在$[mid+1,r]$,否则在$[l,mid]$,于是时间复杂度为$O(n\log_2n)$,调用次数为$1+\left\lceil\log_2n\right\rceil+2\left\lceil\log_2\frac n2\right\rceil$

然后是一般情况(subtask5,6)

我们同样想找到一条在$S\rightarrow T$的任意一条最短路上的边,还是得二分边的编号,一开始把所有边设为$A$,二分到$[l,r]$时先把$[l,mid]$设为$B$,查询最短路,如果最短路变化了,那么$[l,mid]$中一定有这样的边,于是先把$[l,mid]$设回$A$,再去$[l,mid]$中寻找答案,否则它就在$[mid+1,r]$了

假设我们找出来的边是$(x,y)$,我们用这条边构造两个不相交的集合$S_1,S_2$(以下的距离都是边权为$1$的距离)

如果一个点$u$满足$dis_{u,x}<dis_{u,y}$,那么$u\in S_1$,如果$u$满足$dis_{u,x}\gt dis_{u,y}$,那么$u\in S_2$

在$S_1$中以$x$为根构造bfs树,在$S_2$中以$y$为根构造bfs树,那么$S\rightarrow T$一定存在一条最短路是只经过树边和$(x,y)$的

将非树边设为$B$,将树边和$(x,y)$设为$A$,那么接下来要做的事情就和第二个部分分的最后一步一样了

总时间复杂度$O\left(m(\log m+\log n)\right)$,调用次数为$1+\left\lceil\log_2m\right\rceil+2\left\lceil\log_2\frac n2\right\rceil$,刚好是$50$,但官方数据好像并没有卡满...

神仙图论题...

#include"highway.h"
#include<vector>
#include<algorithm>
#include<string.h>
using namespace std;
typedef long long ll;
const int inf=2147483647;
int abs(int x){return x>0?x:-x;}
int h[90010],nex[260010],to[260010],id[260010],M,n,m;
void add(int a,int b,int c){M++;to[M]=b;id[M]=c;nex[M]=h[a];h[a]=M;
}
int q[90010],d1[90010],d2[90010];
void getdis(int*d,int x){int head,tail,i;for(i=1;i<=n;i++)d[i]=inf;head=tail=1;q[1]=x;d[x]=0;while(head<=tail){x=q[head++];for(i=h[x];i;i=nex[i]){if(d[x]+1<d[to[i]]){d[to[i]]=d[x]+1;q[++tail]=to[i];}}}
}
vector<int>u,v,w;
int fa[90010],bfn[90010];
bool t1[260010],t2[260010];
void bfs(int x,bool*t){int head,tail,i;head=tail=1;q[1]=x;M=0;while(head<=tail){x=q[head++];bfn[x]=++M;for(i=h[x];i;i=nex[i]){if(to[i]!=fa[x]&&t[i]){fa[to[i]]=x;q[++tail]=to[i];}}}
}
ll dis;
int solve(int x,int y,bool*t){memset(fa,0,sizeof(fa));memset(bfn,0,sizeof(bfn));int l,r,mid,ans,i;fa[y]=x;bfs(y,t);l=1;r=M;ans=0;while(l<=r){mid=(l+r)>>1;for(i=0;i<m;i++){x=u[i];y=v[i];if(!t1[i*2+1]&&!t2[i*2+1])w[i]=1;else if(!t[i*2+1])w[i]=0;else{if(fa[x]==y)swap(x,y);w[i]=bfn[y]>mid;}}if(ask(w)==dis){ans=mid;r=mid-1;}elsel=mid+1;}for(i=1;i<=n;i++){if(bfn[i]==ans)break;}return i;
}
int sfa[90010];
int get(int x){return x==sfa[x]?x:(sfa[x]=get(sfa[x]));}
void buildt1(int x){int head,tail,i;for(i=1;i<=n;i++)sfa[i]=i;head=tail=1;q[1]=x;while(head<=tail){x=q[head++];for(i=h[x];i;i=nex[i]){if(d1[x]<d2[x]&&d1[to[i]]<d2[to[i]]&&d1[x]!=d1[to[i]]&&get(x)!=get(to[i])){t1[i]=t1[((i-1)^1)+1]=1;sfa[get(to[i])]=get(x);q[++tail]=to[i];}}}
}
void buildt2(int x){int head,tail,i;for(i=1;i<=n;i++)sfa[i]=i;head=tail=1;q[1]=x;while(head<=tail){x=q[head++];for(i=h[x];i;i=nex[i]){if(d1[x]>d2[x]&&d1[to[i]]>d2[to[i]]&&d2[x]!=d2[to[i]]&&get(x)!=get(to[i])){t2[i]=t2[((i-1)^1)+1]=1;sfa[get(to[i])]=get(x);q[++tail]=to[i];}}}
}
void find_pair(int n,vector<int>u,vector<int>v,int A,int B){int i,x,y,l,r,mid;m=u.size();w.resize(m);for(i=0;i<m;i++){u[i]++;v[i]++;add(u[i],v[i],i);add(v[i],u[i],i);}::n=n;::u=u;::v=v;for(i=0;i<m;i++)w[i]=0;dis=ask(w);l=0;r=m-1;while(l<r){mid=(l+r)>>1;for(i=l;i<=mid;i++)w[i]=1;if(ask(w)!=dis){for(i=l;i<=mid;i++)w[i]=0;r=mid;}elsel=mid+1;}x=u[l];y=v[l];getdis(d1,x);getdis(d2,y);buildt1(x);buildt2(y);t1[l*2+1]=t1[l*2+2]=t2[l*2+1]=t2[l*2+2]=1;answer(solve(x,y,t2)-1,solve(y,x,t1)-1);
}

转载于:https://www.cnblogs.com/jefflyy/p/9674412.html

[UOJ409]Highway Tolls相关推荐

  1. 深度残差网络和Highway网络

    今天讲的这两种网络结构都是最新被业界针对图像处理问题提出的最新的结构,主要解决就是超深层的网络在训练优化中遇到的问题.说实话这两种模型就本身来说数学公式都不复杂,但是确实在实战中取得了非常好的效果(深 ...

  2. 【ZOJ - 3946】Highway Project(最短路子图,维护双权值,贪心,最小树形图)

    题干: Edward, the emperor of the Marjar Empire, wants to build some bidirectional highways so that he ...

  3. 去雾论文A real-time fast defogging system to clear the vision of driver in foggy highway using minimu...

    Mandal G, De P, Bhattacharya D. A real-time fast defogging system to clear the vision of driver in f ...

  4. Decision-making Strategy on Highway for Autonomous Vehicles using Deep Reinforcement Learning

    Decision-making Strategy on Highway for Autonomous Vehicles using Deep Reinforcement Learning 采用深度强化 ...

  5. shortcut connection和highway network

    CNN演化 先引入一张CNN结构演化图: 2012年AlexNet做出历史突破以来,直到GoogLeNet出来之前,主流的网络结构突破大致是网络更深(层数),网络更宽(神经元数).所以大家调侃深度学习 ...

  6. Highway Networks网络详解

    神经网络的深度对模型效果有很大的作用,可是传统的神经网络随着深度的增加,训练越来越困难,这篇paper基于门机制提出了Highway Network,使用简单的SGD就可以训练很深的网络,而且opti ...

  7. 「IOI2018」Highway 高速公路收费

    目录 「IOI2018」Highway 高速公路收费 题目描述: 实现细节: 输入格式: 输出格式: 样例: 数据范围与提示: 子任务: 题解: Code 「IOI2018」Highway 高速公路收 ...

  8. highway network

    Highway Network highway network 主要解决了因网络深度的加深,梯度信息回流受阻,从而造成网络训练困难的问题. 它其实就是一个门结构,用这个门来控制输入的信息中有多少信息被 ...

  9. [论文笔记] highway networks

    主要介绍下面两篇论文 <Deep Residual Learning for Image Recognition>. 2015. arXiv pre-print. <Training ...

最新文章

  1. MySQL学习笔记(6)之设计范式
  2. Asp Net Core 5 REST API 使用 RefreshToken 刷新 JWT - Step by Step(三)
  3. sun键盘没有stop键_请教Sun键盘
  4. SCOM 2012知识分享-9:配置警报解决状态
  5. C语言课后习题(12)
  6. 【洛谷1962】 斐波那契数列
  7. qss 样式不生效--注释不能嵌套
  8. [转载]要死的人都后悔些什么
  9. 常见linux服务器存储空间,全面了解linux服务器的常用命令总结
  10. 设置火狐 账号服务器,Firefox 账号问答
  11. android自定义sidebar,Android仿微信通讯录列表侧边栏效果
  12. 轻量级数据格式 —— JSON
  13. A*算法和dijkstra算法
  14. Q格式-TI的dsp的IQmath学习
  15. 新华全媒+|探秘北迁象群的“家”和“家人们”
  16. android开机logo制作
  17. JS编程建议——16:防止switch贯穿
  18. poj 2187(旋转卡壳)
  19. 笔记本显示器仅计算机,Nvidia X服务器设置仅显示1个屏幕(笔记本电脑+已连接外部显示器)...
  20. 链表,队列,堆栈的区别

热门文章

  1. 动态毛玻璃特效html,实现div毛玻璃背景
  2. 计算机记录乐器,2013年计算机考试题模拟考试2套题.doc
  3. 虚拟化构建二分图(BZOJ2080 题解+浅谈几道双栈排序思想的题)
  4. 重新理解创业:一个创业者的中途思考
  5. 我读《高效能人士的七个习惯》
  6. 对比Excel,利用pandas进行数据分析各种用法
  7. ajax的eval的作用,为什么用eval()
  8. 如何成为一名卓越的软件工程师
  9. 网页调用 iOS/Android 客户端
  10. 了解公司企业:Primetics