大意: 给定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;
#endif const 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]);
}
}

Wannafly挑战赛2D Delete (最短路好题)的更多相关文章

  1. Wannafly挑战赛2_D Delete(拓扑序+最短路+线段树)

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

  2. 牛客网 Wannafly挑战赛 C 列一列 简单题 (题目有点坑)

    链接:https://www.nowcoder.com/acm/contest/71/C来源:牛客网 题目描述 小W在计算一个数列{An},其中A1=1,A2=2,An+2=An+1+An.尽管他计算 ...

  3. Wannafly挑战赛24-A-石子游戏--【思维题】

    链接:https://www.nowcoder.com/acm/contest/186/A 来源:牛客网 石子游戏 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他 ...

  4. Wannafly挑战赛21:C - 大水题

    链接:Wannafly挑战赛21:C - 大水题 题意: 现在给你N个正整数ai,每个数给出一“好数程度” gi(数值相同但位置不同的数之间可能有不同的好数程度).对于在 i 位置的数,如果有一在j位 ...

  5. Wannafly挑战赛27

    Wannafly挑战赛27 我打的第一场$Wannafly$是第25场,$T2$竟然出了一个几何题?而且还把我好不容易升上绿的$Rating$又降回了蓝名...之后再不敢打$Wannafly$了. 由 ...

  6. Wannafly 挑战赛 19 参考题解

    这一次的 Wannafly 挑战赛题目是我出的,除了第一题,剩余的题目好像对大部分算法竞赛者来说好像都不是特别友好,但是个人感觉题目质量还是过得去的,下面是题目链接以及题解. [题目链接] Wanna ...

  7. Wannafly挑战赛25C 期望操作数

    Wannafly挑战赛25C 期望操作数 简单题啦 \(f[i]=\frac{\sum_{j<=i}f[j]}{i}+1\) \(f[i]=\frac{f[i]}{i}+\frac{\sum_{ ...

  8. 【Wannafly挑战赛4】F 线路规划 倍增+Kruskal+归并

    [Wannafly挑战赛4]F 线路规划 题目描述 Q国的监察院是一个神秘的组织.这个组织掌握了整个帝国的地下力量,监察着Q国的每一个人.监察院一共有N个成员,每一个成员都有且仅有1个直接上司,而他只 ...

  9. 【Wannafly挑战赛29F】最后之作(Trie树,动态规划,斜率优化)

    [Wannafly挑战赛29F]最后之作(Trie树,动态规划,斜率优化) 题面 牛客 题解 首先考虑怎么计算\([l,r]\)这个子串的不同的串的个数. 如果\(l=1\),我们构建\(Trie\) ...

随机推荐

  1. 重读APUE(9)-SIG_ERR、SIG_DFL、SIG_IGN定义无参数

    下面这几个函数定义,每次看到都会纠结一阵子,奇怪的是为什么没有参数? #define SIG_ERR (void (*)())-1 #define SIG_DFL (void (*)())0 #def ...

  2. zookeeper源码 — 三、集群启动—leader、follower同步

    zookeeper集群启动的时候,首先读取配置,接着开始选举,选举完成以后,每个server根据选举的结果设置自己的角色,角色设置完成后leader需要和所有的follower同步.上面一篇介绍了le ...

  3. 通过蓝牙共享网络设置Charles抓包

    在办公室连接WiFi时,电脑和移动设备分配到的IP地址不在同一网段, 但是Android系统提供了一个非常方便的功能,可以搭建一个网络使得这两台设备处于同一网段,实现无障碍访问,使用Charles抓包 ...

  4. linux下添加动态链接库路径、动态库加载等方法

    linux下添加动态链接库路径的方法 2017年01月20日 10:08:17 阅读数:5596   Linux共享库路径配置 Linux下找不到共享库文件的典型现象为明明已经安装某个软包(如libn ...

  5. .md 即 markdown 文件的基本常用编写语法

    0. 前言 Markdown 是一种纯文本格式的标记语言.通过简单的标记语法,它可以使普通文本内容具有一定的格式.现在的项目都使用了 git 仓库,再加上远程仓库 github 托管,那就难免要写一些 ...

  6. 阶段5 3.微服务项目【学成在线】_day04 页面静态化_19-页面静态化-模板管理-模板存储

    因为没有界面,所以手动的通过操作数据库的方式来存储 比如说要存一个轮播图的模板 把自增的_id去掉 先用测试程序把文件存储到gridFS得到一个gridId,然后拿着这个文件的id 这样就添加好了这一 ...

  7. 一百三十一:CMS系统之轮播图上传图片功能

    将七牛js放到common下 把获取uptoken的接口放到common视图中 把初始化七牛放到banners.js中 //初始化七牛$(function () { qiniujs.setUp({ ' ...

  8. Python之操作RabbitMQ

    RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议. MQ全称为Message Queue, 消息队列(MQ)是一种应用程序 ...

  9. nginx使用vhost子目录

    在主配置文件http模块最后添加如下一句话 [root@host---- ~]# vi /etc/nginx/nginx.conf include /etc/nginx/conf.d/*.conf; ...

  10. swift 第七课 xib 约束的优先级

    前期要实现 一个自适应的label 的时候,就知到xib 约束是有优先级的,一直为深入研究: 乘写这个 博客的机会 ,试验下xib 约束的等级 …… 抱歉要查资料,在重新实践,先把主要浏览的网页 连接 ...