大意: 给定DAG, 给定点$S,T$, 每次询问给出点$x$, 求删除$x$后的$S->T$的最短路, 询问之间独立.

删除点$x$的最短路一定要经过一条边$(u,v)$, 满足$u$拓扑序在$x$前, $v$拓扑序在$x$后. (对于拓扑序相同的点不会有影响)

这样可以枚举每一条边, 用线段树维护删除每个点的答案.

#include <iostream>
#include <sstream>
#include <algorithm>
#include <cstdio>
#include <math.h>
#include <set>
#include <map>
#include <queue>
#include <string>
#include <string.h>
#include <bitset>
#include <unordered_map>
#define REP(i,a,n) for(int i=a;i<=n;++i)
#define PER(i,a,n) for(int i=n;i>=a;--i)
#define hr putchar(10)
#define pb push_back
#define lc (o<<1)
#define rc (lc|1)
#define mid ((l+r)>>1)
#define ls lc,l,mid
#define rs rc,mid+1,r
#define x first
#define y second
#define io std::ios::sync_with_stdio(false)
#define endl '\n'
#define DB(a) ({REP(__i,1,n) cout<<a[__i]<<' ';hr;})
using namespace std;
typedef long long ll;#ifdef ONLINE_JUDGE
const int N = 1e6+10;
#else
const int N = 999;
#endifconst ll INF = 0x3f3f3f3f3f3f3f3f;
int n,m,S,T,deg[N],a[N],vis[N],no[N];
struct _ {int to,w;};
vector<_> g[N], gg[N];
ll d1[N], d2[N], tr[N<<2], ans[N];
queue<int> q;void topo() {REP(i,1,n) if (!deg[i]) q.push(i);int clk = 0;while (q.size()) {int u = q.front(); q.pop();a[u] = ++clk, no[clk] = u;for (auto &e:g[u]) if (!--deg[e.to]) q.push(e.to);}
}
struct __ {int u;ll w;bool operator < (const __ &rhs) const {return w>rhs.w;}
};void DP(ll d[], vector<_> g[], int s) {memset(d,0x3f,sizeof d1);memset(vis,0,sizeof vis);priority_queue<__> q;q.push({s,d[s]=0});while (q.size()) {int u = q.top().u; q.pop();if (vis[u]) continue;vis[u] = 1;for (auto &e:g[u]) {ll dd = d[u]+e.w;if (dd<d[e.to]) q.push({e.to,d[e.to]=dd});}}
}void update(int o, int l, int r, int ql, int qr, ll v) {if (ql<=l&&r<=qr) return tr[o]=min(tr[o],v),void();if (mid>=ql) update(ls,ql,qr,v);if (mid<qr) update(rs,ql,qr,v);
}
void dfs(int o, int l, int r) {if (l==r) { if (d1[no[l]]==INF||d2[no[l]]==INF) ans[no[l]]=d1[T];else ans[no[l]]=tr[o];}else { tr[lc]=min(tr[lc],tr[o]);tr[rc]=min(tr[rc],tr[o]);dfs(ls),dfs(rs);}
}int main() {scanf("%d%d%d%d", &n, &m, &S, &T);REP(i,1,m) {int x, y, z;scanf("%d%d%d", &x, &y, &z);g[x].pb({y,z}),++deg[y];gg[y].pb({x,z});}topo();DP(d2,gg,T);DP(d1,g,S);memset(tr,0x3f,sizeof tr);REP(i,1,n) {for (auto e:g[i]) {if (a[e.to]!=a[i]+1&&d1[i]!=INF&&d2[e.to]!=INF) {update(1,1,n,a[i]+1,a[e.to]-1,e.w+d1[i]+d2[e.to]);}}}dfs(1,1,n);int q;scanf("%d", &q);while (q--) { int t;scanf("%d", &t);printf("%lld\n",ans[t]);}
}

转载于:https://www.cnblogs.com/uid001/p/10986812.html

Wannafly挑战赛2D Delete (最短路好题)相关推荐

  1. [Wannafly挑战赛2D-Delete]最短路

    [Wannafly挑战赛2D-Delete]最短路 题目描述 给定一张 n 个点,m 条边的带权有向无环图,同时给定起点 S 和终点 T ,一共有 q 个询问,每次询问删掉某个点和所有与它相连的边之后 ...

  2. Wannafly挑战赛26-B 冥土追魂

    地址:https://www.nowcoder.com/acm/contest/212/B 思路:对于行列选取,是选择所有行中的最大值的最小值,当是并不能用贪心来做,例如 2 2 2 7 8 1 9 ...

  3. Wannafly挑战赛26 题解

    Wannafly挑战赛26 题目连接 https://www.nowcoder.com/acm/contest/212#question A. 御坂网络 枚举圆心所在的位置, O ( n ) O(n) ...

  4. Wannafly挑战赛13 B-Jxc军训

    Wannafly挑战赛13 B-Jxc军训 链接:https://www.nowcoder.com/acm/contest/80/B 来源:牛客网 题目描述 在文某路学车中学高一新生军训中,Jxc正站 ...

  5. Wannafly挑战赛22游记

    Wannafly挑战赛22游记 幸运的人都是相似的,不幸的人各有各的不幸. --题记 A-计数器 题目大意: 有一个计数器,计数器的初始值为\(0\),每次操作你可以把计数器的值加上\(a_1,a_2 ...

  6. Wannafly挑战赛19

    Wannafly挑战赛19 A. 队列Q 需要支持把一个元素移到队首,把一个元素移到队尾,移到队首就直接放到队首前面那个位置,原位置标为0,队尾同理. #include <bits/stdc++ ...

  7. Wannafly挑战赛18

    Wannafly挑战赛18 A. 序列 先考虑暴力,相邻两个树之间乘上给定的三种数,递推出下一个位置填什么,然后再check一下,最后一位是否为1即可.这样时间显然不行,但是给我们一种思路,就是中间的 ...

  8. Wannafly 挑战赛27 题解

    Wannafly 挑战赛27 题目连接 https://www.nowcoder.com/acm/contest/215#question A.灰魔法师 题目 题解 考虑到可能的完全平方数只有4004 ...

  9. Wannafly挑战赛24

    Wannafly挑战赛24 题目连接 https://www.nowcoder.com/acm/contest/186#question A.石子游戏 题解 注意到当石子个数为偶数的时候,每回合都会减 ...

  10. Wannafly挑战赛18B 随机数

    Wannafly挑战赛18B 随机数 设\(f_i\)表示生成\(i\)个数有奇数个1的概率. 那么显而易见的递推式:\(f_i=p(1-f_{i-1})+(1-p)f_{i-1}=(1-2p)f_{ ...

最新文章

  1. 《百面机器学习》---AI算法工程师求职必备“面经”
  2. Word中的图片显示出不来的解决办法
  3. Python基本语法_函数属性 参数类型 偏函数的应用
  4. sublime 安装插件GitGutter报错,git binary cannot be found等等
  5. dba mysql命令_Mysql常用DBA命令
  6. 位运算,处理前台多选值
  7. spring整合webservice
  8. 从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 二十三║Vue实战:Vuex 其实很简单
  9. 使用代码设置Item级的权限(权限总结1)
  10. jquery页面跳转带cookie_搭建谷歌浏览器无头模式抓取页面服务,laravelgt;phpgt;pythongt;docker...
  11. 1705. 吃苹果的最大数目
  12. [2019杭电多校第五场][hdu6625]three arrays(01字典树)
  13. 人睡眠时做恶梦以及梦魇或鬼压身的原因
  14. Fcitx使用搜狗词库与皮肤
  15. 从零搭建Angular10项目
  16. 深度学习图像数据库总结(收藏用)
  17. Hadoop-LZO 编译步骤
  18. 阿里云全站加速是什么?与CDN有什么区别
  19. 谷歌外链建设2022年如何判断和购买google优质外链
  20. HTML清除浮动的四种方式

热门文章

  1. java filter重定向_Java Filter(过滤器)——重定向
  2. 计算机应用基础第3次平时作业,计算机应用基础第3次作业.doc
  3. 流程图函数’怎么画_程序员必备画图技能之——流程图
  4. python画哆啦a梦图片_画了个多啦A梦,但是感觉怪怪的
  5. 知识图谱构建工具_自动构建知识图谱
  6. CV求职面经 -- 数学基础
  7. React Native 圆形进度条组件
  8. sudo chown -R nobody:nogroup clear
  9. oracle中with子句的用法(转)
  10. 如何设置、恢复默认浏览器为IE