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

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

题目描述

给定一张 n 个点,m 条边的带权有向无环图,同时给定起点 S 和终点 T ,一共有 q 个询问,每次询问删掉某个点和所有与它相连的边之后 S 到 T 的最短路,询问之间互相独立(即删除操作在询问结束之后会立即撤销),如果删了那个点后不存在 S 到 T 的最短路,则输出 −1 。点的编号为 1 到 n 。

输入格式

第一行四个正整数表示 n,m,S,T ,意义如题所述。

接下来 m 行每行三个正整数 x,y,z ,表示有一条 x 到 y 的有向边,权值为 z 。

接下来一行一个正整数 Q 表示询问次数。

最后 Q 行每行一个正整数 k 表示这次询问要删除点 k  。

输出格式

输出 Q 行,每行一个整数表示答案。

样例一

input

6 7 1 5
1 2 2
2 3 4
3 4 3
4 5 5
3 5 9
1 6 10
6 5 13
4
3
4
2
6

output

23
15
23
14

限制与约定

对于 100% 的数据,1≤S,T,x,y,k≤n≤10^5 ;1≤Q≤10^5 ;1≤m≤2×10^5 ;0≤z≤10^9

 

 

Solution

题意为:给定一个DAG,多次询问任意删掉一个点之后,S到T的最短路。

首先,这是一个DAG,因此S到T的最短路是可以沿拓扑序DP直接求出的,因此我们不花半点力气,就得到了一个O(nq)的算法。

 

现在我们考虑删点对于一个DAG的影响,即之前通过拓扑序求出的拓扑图其中一个点不能通过。

先特判S到T不连通的情况,直接输出-1即可。

现在我们保证了S到T有一条可行路径。考虑拓扑图之外的边对其影响,它们会提供一种可行的方式跨过被删点连向之后的节点,形成最短路的总代价为  dist(S,u)+dist(v,T)+dis(u,v)   ,而这一条路会对在拓扑图中u,v两点之间所有点产生相同的影响。即u,v之间所有点形成的最短路,都能用这一条边形成的路径代替(不保证最短,只保证可行)。

于是问题变成了:一堆边会改变拓扑序中连续的一段区间[l,r]的点的代价,求任意某点的最优代价。区间修改+单点查询,线段树维护最小值即可。

时间复杂度为  O(nlgn)  。

 

#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <string>
#include <cstring>
#include <ctime>
#include <cassert>
#include <string.h>#define MP(A,B) make_pair(A,B)
#define PB(A) push_back(A)
#define SIZE(A) ((int)A.size())
#define LEN(A) ((int)A.length())
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define fi first
#define se secondusing namespace std;template<typename T>inline bool upmin(T &x,T y) { return y<x?x=y,1:0; }
template<typename T>inline bool upmax(T &x,T y) { return x<y?x=y,1:0; }typedef long long ll;
typedef unsigned long long ull;
typedef long double lod;
typedef pair<int,int> PR;
typedef vector<int> VI;const lod eps=1e-11;
const lod pi=acos(-1);
const int oo=1<<30;
const ll loo=1ll<<62;
const int mods=1e9+7;
const ll INF=1ll<<60;
const int MAXN=1e5+500;
/*--------------------------------------------------------------------*/
struct enode{int v; ll c; }; 
vector<enode> e1[MAXN],e2[MAXN];
int d1[MAXN],d2[MAXN],dfn[MAXN];
ll f1[MAXN],f2[MAXN];
queue<int> que;
inline int read()
{int f=1,x=0; char c=getchar();while (c<'0'||c>'9') { if (c=='-') f=-1; c=getchar(); }while (c>='0'&&c<='9') { x=(x<<3)+(x<<1)+c-'0'; c=getchar(); }return x*f;
}
inline char readc()
{char c=getchar();while (!isalnum(c)) c=getchar();return c;
}
struct Segment_Tree
{struct treenode{int l,r; ll s; } tree[MAXN<<2];void build(int x,int l, int r){tree[x].s=INF;if ((tree[x].l=l)==(tree[x].r=r)) return;int mid=(tree[x].l+tree[x].r)>>1;build(x<<1,l,mid);build(x<<1|1,mid+1,r);}void change(int x,int L,int R,ll val){if (L<=tree[x].l&&tree[x].r<=R) { tree[x].s=min(tree[x].s,val); return; }int mid=(tree[x].l+tree[x].r)>>1;if (L<=mid) change(x<<1,L,R,val);if (mid<R) change(x<<1|1,L,R,val);}ll query(int x,int y){if (tree[x].l==tree[x].r) return tree[x].s;int mid=(tree[x].l+tree[x].r)>>1;if (y<=mid) return min(tree[x].s,query(x<<1,y));else return min(tree[x].s,query(x<<1|1,y));}
} segment;
int main()
{//freopen("shortest.in","r",stdin);//freopen("shortest.out","w",stdout);int n=read(),m=read(),S=read(),T=read();for (int i=1;i<=m;i++){int u=read(),v=read(),c=read();e1[u].push_back((enode){v,c});e2[v].push_back((enode){u,c});d1[v]++; d2[u]++;}int Dfn=0;for (int i=1;i<=n;i++) f1[i]=INF; f1[S]=0;for (int i=1;i<=n;i++) if (d1[i]==0) que.push(i); while (!que.empty()){int q=que.front();dfn[q]=++Dfn;que.pop();for (int i=0;i<e1[q].size();i++){int to=e1[q][i].v,c=e1[q][i].c;d1[to]--;f1[to]=min(f1[to],f1[q]+c);if (d1[to]==0) que.push(to);}}que.push(T);for (int i=1;i<=n;i++) f2[i]=INF; f2[T]=0;for (int i=1;i<=n;i++) if (d2[i]==0) que.push(i);while (!que.empty()){int q=que.front();que.pop();for (int i=0;i<e2[q].size();i++){int to=e2[q][i].v,c=e2[q][i].c;d2[to]--;f2[to]=min(f2[to],f2[q]+c);if (d2[to]==0) que.push(to);}}segment.build(1,1,n);for (int i=1;i<=n;i++) for (int j=0;j<e1[i].size();j++)if (f1[i]!=INF&&f2[e1[i][j].v]!=INF&&dfn[i]+1<dfn[e1[i][j].v]) segment.change(1,dfn[i]+1,dfn[e1[i][j].v]-1,f1[i]+f2[e1[i][j].v]+e1[i][j].c);int Case=read();while (Case--){int x=read();if (f1[x]==INF||f2[x]==INF) printf("%lld\n",f1[T]);else {ll q=segment.query(1,dfn[x]);printf("%lld\n",q==INF?-1:q);}}return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/315871.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ASP.NET Core MVC 视图

ASP.NET Core MVC中视图的知识和ASP.NET MVC有很多相似之处&#xff0c;学习难度较低。以下内容主要体现了编程中模块化的思想&#xff0c;模块化才应是我们关注的重点。布局用于提供各个页面所需的公共部分&#xff0c;如&#xff1a;菜单、页头、页尾等。在ASP.NET Core中默认…

ASP.NET Core 通过 Microsoft.DotNet.Watcher.Tools 实现热部署

之前开发前端的时候&#xff0c;webpack 会有热更新工具&#xff0c;在修改了代码之后&#xff0c;自动将代码编译&#xff0c;实时展现到页面上&#xff0c;给开发带来了极大的方便。Java也可以通过第三方插件JRebel实现热部署&#xff0c;不用频繁的重启Tomcat。微软官方也为…

P3825 [NOI2017]游戏

P3825 [NOI2017]游戏 题目描述 小 L 计划进行n场游戏&#xff0c;每场游戏使用一张地图&#xff0c;小 L 会选择一辆车在该地图上完成游戏。 小 L 的赛车有三辆&#xff0c;分别用大写字母A、B、C表示。地图一共有四种&#xff0c;分别用小写字母x、a、b、c表示。其中&#x…

事关SuperSocket发布,寻找YangFan哥哥

SuperSocket近日发布了2.0的第一个预览版《SuperSocket 2.0 Preview1 发布&#xff0c;.NET Socket服务器框架》&#xff0c;在NuGet上以一个包含数个SuperSocket程序集的大包的形式发布。https://www.nuget.org/packages/SuperSocket/2.0.0-preview1我原意以独立小包的形式发布…

P1963 [NOI2009]变换序列

题目描述 不想水字&#xff0c;详见某谷&#xff1a;P1963 [NOI2009]变换序列 solution 其实 的计算就类似于环上的距离。 对于每一个 都可能有两种位置选择&#xff1a;&#xff0c; 。 所以把它们分别连边&#xff0c;二分图上匈牙利算法求完美匹配即可。 #include&…

一次 .NET Core 中玩锁的经历:ManualResetEventSlim, SemaphoreSlim

最近同事对 .net core memcached 缓存客户端 EnyimMemcachedCore 进行了高并发下的压力测试&#xff0c;发现在 linux 上高并发下使用 async 异步方法读取缓存数据会出现大量失败的情况&#xff0c;比如在一次测试中&#xff0c;100万次读取缓存&#xff0c;只有12次成功&…

Redis作者antirez:开源维护者的挣扎

这两天&#xff0c;一篇名为《开源维护者的挣扎》的文章被迅速顶至 Hacker News 首页&#xff0c;这是 Redis 作者 antirez 发布的最新博客。几个月前&#xff0c;一名开源项目的维护者向 antirez 发邮件&#xff0c;倾诉自己苦心维护项目多年&#xff0c;这或多或少带来了一些…

黑科技抢先尝(续) - Windows terminal中WSL Linux 终端的极简美化指南

之前&#xff0c;本人写了两篇文章 黑科技抢先尝 | Windows全新终端初体验(附代码Build全过程) 和 程会玩 | 无需自行编译也能玩转 Windows Terminal&#xff0c;介绍了玩转Windows terminal的两种方式。今天这篇文章&#xff0c;主要介绍如何美化 Windows terminal 中 WSL 的 …

P3203 [HNOI2010]弹飞绵羊

P3203 [HNOI2010]弹飞绵羊 题目描述 详见&#xff1a;P3203 [HNOI2010]弹飞绵羊 solution 这是一道LCT的裸题。 但是我并不想用LCT解决此题&#xff08;In fact 是不会LCT ~QAQ&#xff09; 于是我们开始大力分块。 考虑把弹跳装置分块&#xff0c;我们每次需要知道在一…

L - Two Ants Gym - 102823L

L - Two Ants Gym - 102823L 题意&#xff1a; 有两个线段A&#xff0c;B&#xff0c;两个线段不会超过一个公共点&#xff0c; 你站在线段B上&#xff0c;整个平面你看不到的区域的面积(如图中S所在区域) 题解&#xff1a; 计算几何&#xff0c;恶心题。调了一个小时还是…

C# 8.0 中开启默认接口实现

当你升级到 C# 8.0 和 .NET Core 3.0 之后&#xff0c;你就可以开始使用默认接口实现的功能了。从现在开始&#xff0c;你可以在接口里面添加一些默认实现的成员&#xff0c;避免在接口中添加成员导致大量对此接口的实现崩溃。要写出并且正常使用接口的默认实现&#xff0c;你需…

P4396 [AHOI2013]作业

P4396 [AHOI2013]作业 题目描述 详见&#xff1a;P4396 [AHOI2013]作业 solution 莫队树状数组的裸题&#xff08;莫队分块&#xff0c;CDQ分治都可以&#xff0c;莫队线段树大概需要卡常&#xff09;。 时间复杂度 Code #include<bits/stdc.h> using namespac…

在编写异步方法时,使用 ConfigureAwait(false) 避免使用者死锁

我在 使用 Task.Wait()&#xff1f;立刻死锁&#xff08;deadlock&#xff09; 一文中站在类库使用者的角度看 async/await 代码的死锁问题&#xff1b;而本文将站在类库设计者的角度来看死锁问题。阅读本文&#xff0c;我们将知道如何编写类库代码&#xff0c;来尽可能避免类库…

韩国政府计划从Windows 7迁移到Linux

据《韩国先驱报》的报道&#xff0c;韩国内政部于上周四表示&#xff0c;韩国政府计划将其用于办公的计算机操作系统从 Windows 迁移至 Linux。当然不是马上全面迁移 —— 内政部将会“第一个吃螃蟹”。他们准备在其 PC 上试运行 Linux&#xff0c;如果没有出现安全问题&#x…

黑科技抢先尝(续2) - Windows terminal中Powershell Tab的美化全攻略

温馨提示: 原文中含有一些外部链接&#xff0c;点击全文左下角的"阅读原文"体验会更佳喔~ 接着之前的文章 黑科技抢先尝(续) - Windows terminal中WSL Linux 终端的极简美化指南&#xff0c;依然假定你安装好了windows terminal预编译版本。这次我的目标是将PowerShe…

P1712 [NOI2016]区间

P1712 [NOI2016]区间 题目描述 P1712 [NOI2016]区间 Solution 尺取法线段树 一个显然的想法是按区间长度排序。 每一次多选取一个区间相当于区间覆盖次数加1&#xff0c;每一次少选取一个区间就有区间覆盖次数减1。 可以用线段树维护区间覆盖次数的最大值。 于是转化成…

.NET开发人员如何开始使用ML.NET

随着谷歌&#xff0c;Facebook发布他们的工具机器学习工具Tensorflow 2和PyTorch &#xff0c;微软的CNTK 2.7之后不再继续更新&#xff08;https://docs.microsoft.com/zh-cn/cognitive-toolkit/releasenotes/cntk_2_7_release_notes&#xff09;&#xff0c;Build 2019 微软也…

CF1271D Portals

CF1271D Portals 题意&#xff1a; 题意选自洛谷 题解&#xff1a; 首先要先发现性质&#xff1a;对于任何一个城堡u&#xff0c;如果要往u驻军&#xff0c;则在攻占编号最大的能向u行军的城堡后再驻军&#xff0c;答案一定不会变劣。你想想&#xff0c;如果后面有编号更大…

P2605 [ZJOI2010]基站选址

P2605 [ZJOI2010]基站选址 题目描述 详见&#xff1a;P2605 [ZJOI2010]基站选址 Solution 首先不难想到一个 的DP。 表示前个村庄选择了个基站的总费用。 考虑如何优化这个转移。 对于村庄&#xff0c;我们记录它覆盖范围内最靠前的村庄 和最靠后的村庄 。 倘若在…

CF980D Perfect Groups

CF980D Perfect Groups 题意&#xff1a; 将一个串划分为多个子集&#xff08;不要求连续&#xff09;&#xff0c;要求同一子集内两任意元素的积为平方数 定义一个串的答案为所需的最少子集个数 一个长度为 n 的串有 n(n1)2\frac{n(n1)}{2}2n(n1)​个非空子串&#xff0c;…