bzoj2725 故乡的梦

题目描述
https://www.lydsy.com/JudgeOnline/problem.php?id=2725

题解
给你一张图,每次删除一条边问当前的最短路。
先随便拉一条最短路出来,如果删除的边不在这条最短路上那么答案就是原图最短路。
如果删除的边在最短路上,那么新的最短路肯定是从s开始先在最短路上跑一段,在外面跑一段再回到最短路上。
对于每条不在最短路上的边,我们找到它对应的最短路链上对于S和对于T的最近点,len=ws[i]+wt[i]+edge,两个最近点分别为L,R。
如果删除的边在[L,R]内,那么这组最短路就可行。所以我们建一棵线段树,对于每条边求出[L,R]并把这个区间赋个最小值,查询的时候在线段树上对应查询就好了。

代码

#include<bits/stdc++.h>
#define ll long long
#define inf 9999999999999999ll
#define N 200010
using namespace std;
int n,m,Q,ss,tt,k=1,cnt,pre[N],la[N],ff[N*2];
int g[2][N],tag[N],po[N],d[N];ll w[2][N];
struct node{int a,b,c;}e[N*2];
struct info{int x;ll y;bool operator<(const info &p)const{return y>p.y;}
};
struct data{ll minn;}t[N*4];
priority_queue<info>q;
map<int,int>h[N];
void add(int a,int b,int c)
{e[++k]=(node){a,b,c};ff[k]=la[a];la[a]=k;e[++k]=(node){b,a,c};ff[k]=la[b];la[b]=k;h[a][b]=h[b][a]=(k>>1);
}int find(int x,int p)
{if(!x)return 0;if(g[p][x])return g[p][x];return g[p][x]=find(e[pre[x]].a,p);
}
void dij(int S,int p)
{for(int i=1;i<=n;i++)w[p][i]=inf;q.push((info){S,w[p][S]=0});pre[S]=0;while(q.size()){info tmp=q.top();q.pop();int x=tmp.x;ll y=tmp.y;if(w[p][x]!=y)continue;for(int a=la[x];a;a=ff[a])if(w[p][e[a].b]>y+e[a].c){pre[e[a].b]=a;w[p][e[a].b]=y+e[a].c;q.push((info){e[a].b,w[p][e[a].b]});}}if(!p){int pos=tt;while(pos){tag[pre[pos]>>1]=1;g[p][pos]=pos;cnt++;d[po[cnt]=pos]=cnt;pos=e[pre[pos]].a;}}else for(int i=1;i<=cnt;i++)g[p][po[i]]=po[i];for(int i=1;i<=n;i++)g[p][i]=find(i,p);
}class seg_tree
{public:void build(int x,int l,int r){t[x].minn=inf;if(l==r)return;int mid=l+r>>1,lc=x<<1,rc=lc+1;build(lc,l,mid);build(rc,mid+1,r);}void modify(int x,int l,int r,int ql,int qr,ll val){if(ql<=l&&r<=qr){t[x].minn=min(t[x].minn,val);return;}int mid=l+r>>1,lc=x<<1,rc=lc+1;if(ql<=mid)modify(lc,l,mid,ql,qr,val);if(qr>mid)modify(rc,mid+1,r,ql,qr,val);}ll qry(int x,int l,int r,int pos){if(l==r)return t[x].minn;int mid=l+r>>1,lc=x<<1,rc=lc+1;ll res=t[x].minn;if(pos<=mid)res=min(res,qry(lc,l,mid,pos));else res=min(res,qry(rc,mid+1,r,pos));return res;}
}T;int main()
{//freopen("1.in","r",stdin);int a,b,c,L,R;ll len,ans;scanf("%d%d",&n,&m);for(int i=1;i<=m;i++)scanf("%d%d%d",&a,&b,&c),add(a,b,c);scanf("%d%d",&ss,&tt);dij(ss,0);dij(tt,1);T.build(1,1,cnt);for(int i=2;i<=k;i++){if(tag[i>>1])continue;L=d[g[0][e[i].a]];R=d[g[1][e[i].b]];len=w[0][e[i].a]+w[1][e[i].b]+e[i].c;if(L>R)swap(L,R);if(L&&R&&L<R)T.modify(1,1,cnt,L,R-1,len);}scanf("%d",&Q);while(Q--){scanf("%d%d",&a,&b);if(!tag[h[a][b]])ans=w[0][tt];else ans=T.qry(1,1,cnt,min(d[a],d[b]));if(ans==inf)printf("Infinity\n");else printf("%lld\n",ans);}return 0;
}

bzoj2725 故乡的梦相关推荐

  1. 2725. [Violet 6]故乡的梦(删边最短路同[TJOI2012]桥)

    2725. [Violet 6]故乡的梦 和P2685 [TJOI2012]桥可以说是一模一样,判断u,vu,vu,v是否在最短路径上可以利用之前预处理的id[]详细看代码. #include< ...

  2. 2725: [Violet 6]故乡的梦

    2725: [Violet 6]故乡的梦 Time Limit: 20 Sec   Memory Limit: 128 MB Submit: 607   Solved: 190 [ Submit][ ...

  3. [BZOJ2725/Violet 6]故乡的梦

    Description Input Output Sample Input 6 7 1 2 1 2 3 1 3 4 2 4 5 1 5 6 1 1 3 3 4 6 3 1 6 4 1 2 1 3 4 ...

  4. BZOJ2725 [Violet 6]故乡的梦

    想日这道题都得有一年了--今天发现yh都把这题日了,我才终于来日他 这题题解网上都烂大街了,我也懒得写--不过这题其实不需要线段树的 先任意搞一条S到T的最短路,然后对于不在最短路上的一条边,x-&g ...

  5. 【BZOJ2725】【Violet 6】故乡的梦

    [题目链接] 点击打开链接 [思路要点] 补档博客,无题解. [代码] #include<bits/stdc++.h> using namespace std; #define MAXN ...

  6. [violet6] 故乡的梦

    题目 描述 不知每日疲于在城市的水泥森林里奔波的你会不会有时也曾向往过乡村的生活.你会不会幻想过,在夏日一个静谧的午后,你沉睡于乡间路边的树荫里,一片叶子落在了你的肩上, 而你正做着一个悠长的梦,一个 ...

  7. BZOJ 2725 [Violet 6]故乡的梦

    堆优dijkstra+线段树 膜:http://blog.csdn.net/popoqqq/article/details/47841783 为了表达清楚,记不删边时最短路为E1,删去某一条E1上的边 ...

  8. c语言以16进制输出大写字母,【C语言】十六进制形式输出应用程序

    1.前言 最近在看到同事写了一款封印病毒的程序,非常有意思!原理大致是将PE文件中的ASCII转换成HEX输出到文本中.这样做的目的是为了保存病毒样本的时候不会被杀毒软件查杀!然而却是delphi写的 ...

  9. 一句话题解(20170801~20170125)

    8.1 bzoj 4720 noip2016 换教室 floyd预处理+期望(薛定谔的猫) bzoj 4318 OSU! 三次函数期望值 从一次.二次推得 8.2 bzoj 1076 状压+期望DP ...

最新文章

  1. 程序员怎么面试求职?需要注意哪些因素?
  2. 联想EDU同传系统 版本7.5 7.6在机房中出现的一些故障和解决办法
  3. (原)用pixi.js 实现 方块阵点击后原地自转效果
  4. C++的常量折叠(一)
  5. 使用nodejs进行WEB开发
  6. Web Hacking 101 中文版 十八、内存(二)
  7. 2021年五月中旬推荐文章
  8. java策略模式详解_Java经典设计模式之策略模式原理与用法详解
  9. 什么题材的短视频最吸引人观看?
  10. 将原生安卓项目封装为cordova插件实例分析
  11. Tomcat优化之配置线程池高并发连接
  12. 如何写一份交互说明文档
  13. C语言解释一下BA无标度网络
  14. pythonnumpy安装教程_windows 下python+numpy安装实用教程
  15. d3中元素拖拽drag实例
  16. 第三方app版本更新 自定义接口协议+自定义对话框+显示进度对话框
  17. 国外问卷调查有哪几种类型?
  18. 续集来了:上回那个“吃鸡”成功的IC人后来发生了什么?
  19. ecs共享型s6怎么样?
  20. 人工智能医疗:小荷健康竞品分析报告

热门文章

  1. 格雷欣法则、囚徒困境及其他
  2. 新版标准日本语高级_第11课
  3. JavaScript 将字符串转换为数字 – JS 字符串转 Int 示例
  4. python discuz论坛帖子_Python + Selenium 入门之Discuz论坛实例
  5. 1. HbuliderX-移动端APP开发-前端开发ajax请求失败或错误-常见问题-原因分析-处理
  6. 断网攻击以及简单木马制作
  7. steam中最好玩的游戏是是吗
  8. 我带你去哪里 XIII
  9. 你和阿里巴巴员工的编程水平差几个等级?
  10. 初中没毕业建议学计算机吗,初中没毕业学什么好 能学电脑技术吗?