博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ2725 : [Violet 6]故乡的梦
阅读量:6965 次
发布时间:2019-06-27

本文共 2078 字,大约阅读时间需要 6 分钟。

如果S==T,那么答案为0。

如果S与T不连通,那么答案为inf。

否则,S到T的最短路径上至少有一条边。

求出以S为源点的最短路图,是个DAG,随便抓一条S到T的最短路,记为P。

设dpS[x]表示在这个图上,能到达x点的离S最近的在P上的点,可以通过拓扑排序+DP求出。

然后求出以T为源点的最短路图,在T的最短路图里找到P。

设dpT[x]表示在这个图上,能到达x点的离T最近的在P上的点,同样可以通过拓扑排序+DP求出。

然后把P路径上的边按S到T的方向,从1开始标号。

对于一条边,如果不在P上,那么答案显然为S到T的最短路。

否则,对于一条不在P上的边长为w的有向边x->y,P中dpS[x]到dpT[y]-1之间的边删掉后,均可以用disS[x]+disT[y]+w代替。

用线段树维护即可,时间复杂度$O((n+m)\log n+q)$。

 

#include
#include
#include
using namespace std;typedef long long ll;typedef pair
P;const int N=200010;const ll inf=1LL<<60;int n,m,que,S,T,i,x,y,g[N],v[N<<1],w[N<<1],nxt[N<<1],ed;int G[N],V[N],NXT[N],pre[N],d[N];int path[N],cnt,id[N],fs[N],ft[N];int q[N],h,t;ll ds[N],dt[N];struct E{int x,y,z;}e[N];priority_queue

,greater

>Q;inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}inline void add(int x,int y,int z){v[++ed]=y;w[ed]=z;nxt[ed]=g[x];g[x]=ed;}inline void ADD(int x,int y){pre[y]=x;d[y]++;V[++ed]=y;NXT[ed]=G[x];G[x]=ed;}inline int onpath(int x,int y){ if(!id[x]||!id[y])return 0; if(id[x]+1==id[y])return id[x]; if(id[y]+1==id[x])return id[y]; return 0;}ll val[525000],ans[N];void build(int x,int a,int b){ val[x]=inf; if(a==b)return; int mid=(a+b)>>1; build(x<<1,a,mid),build(x<<1|1,mid+1,b);}void change(int x,int a,int b,int c,int d,ll p){ if(c<=a&&b<=d){val[x]=min(val[x],p);return;} int mid=(a+b)>>1; if(c<=mid)change(x<<1,a,mid,c,d,p); if(d>mid)change(x<<1|1,mid+1,b,c,d,p);}void dfs(int x,int a,int b){ if(a==b){ans[a]=val[x];return;} int mid=(a+b)>>1; val[x<<1]=min(val[x<<1],val[x]),dfs(x<<1,a,mid); val[x<<1|1]=min(val[x<<1|1],val[x]),dfs(x<<1|1,mid+1,b);}int main(){ read(n),read(m); for(i=1;i<=m;i++){ read(e[i].x),read(e[i].y),read(e[i].z); add(e[i].x,e[i].y,e[i].z); add(e[i].y,e[i].x,e[i].z); } read(S),read(T); if(S==T){ for(read(que);que--;puts("0")); return 0; } for(i=1;i<=n;i++)ds[i]=inf;Q.push(P(ds[S]=0,S)); while(!Q.empty()){ P t=Q.top();Q.pop(); if(ds[t.second]

  

转载地址:http://wxfsl.baihongyu.com/

你可能感兴趣的文章
Session与request的使用
查看>>
Node.js session 存储的几种方法
查看>>
mongodb的监控与性能优化
查看>>
使用ContentProvider
查看>>
《为了你我愿意热爱整个世界》
查看>>
闭包block多种应用方式
查看>>
前端框架
查看>>
iOS多线程:『NSOperation、NSOperationQueue』详尽总结
查看>>
在linux上配置JDK环境变量
查看>>
layer.load 支持文字内容
查看>>
java如何访问局域网共享文件
查看>>
Maven学习(六):灵活的构建
查看>>
淘宝姐姐不要过滤掉js我们还是好朋友
查看>>
Nutch爬取Ajax请求的动态网页
查看>>
SVN 使用细则
查看>>
7天学会spring cloud教程
查看>>
基于Token的WEB后台认证机制
查看>>
Django学习笔记(5)---ForeignKey
查看>>
10、Mapreduce的一些场景
查看>>
HDFS——HDFS+Zookeeper搭建高可用HDFS
查看>>