bzoj2725
* 给出一张图
* 每次删掉一条边后求 the shortest path from S to T
* 线段树维护最短路径树
* 具体维护从某点开始偏离最短路而到达 T 的最小距离
* 首先记录下最短路径
* 考虑每一种走法都是 S -> a -> x -> y -> b -> T, 其中 S -> a, b -> T 是最短路上的边
* 把树上的点i能以最短路到达的点标记上Id[i],每个点只标记第一次
* 枚举所有的边
* 对于边(u,v),若u从起点标记到的Id[] < v从终点标记到的 Id[]
* 则线段树区间修改最小值
* 对于每次用意义的询问,只需输出较小Id[]的点所取到的最小值
- #include <bits/stdc++.h>
- const int N = 2e5 + ;// oo = 999999999;
- #define LL long long
- const LL oo = 9e18;
- int n, m, S, T;
- int Short_path[N], Snum[N], Tnum[N], Id[N], path_js;
- bool vis[N];
- int head[N], now;
- struct Node {int u, v, w, nxt;} G[N << ];
- LL dis_s[N], dis_t[N];
- LL Minn[N << ], Ans[N];
- inline void Add(int u, int v, int w) {
- G[++ now].v = v, G[now].w = w, G[now].nxt = head[u], head[u] = now;
- }
- struct Node_ {
- int u; LL dis;
- bool operator < (const Node_ a) const {
- return dis > a.dis;
- }
- };
- std:: priority_queue <Node_> Q;
- void Dijkstra(int start, LL dis_[]) {
- for(int i = ; i <= n; i ++) dis_[i] = oo, vis[i] = ;
- Node_ now; now = (Node_) {start, }; dis_[start] = ;
- Q.push(now);
- while(!Q.empty()) {
- Node_ topp = Q.top();
- Q.pop();
- if(vis[topp.u]) continue;
- vis[topp.u] = ;
- for(int i = head[topp.u]; ~ i; i = G[i].nxt) {
- int v = G[i].v;
- if(dis_[v] > dis_[topp.u] + G[i].w) {
- dis_[v] = dis_[topp.u] + G[i].w;
- Q.push((Node_) {v, dis_[v]});
- }
- }
- }
- }
- inline void Bfs(int x, LL dis_[], int bel[]) {
- std:: queue <int> Q1;
- Q1.push(Short_path[x]);
- bel[Short_path[x]] = x;
- while(!Q1.empty()) {
- int topp = Q1.front();
- Q1.pop();
- for(int i = head[topp]; ~ i; i = G[i].nxt) {
- int v = G[i].v;
- if(!Id[v] && !bel[v] && dis_[v] == dis_[topp] + G[i].w) {
- bel[v] = x;
- Q1.push(v);
- }
- }
- }
- }
- #define lson jd << 1
- #define rson jd << 1 | 1
- void Sec_G(int l ,int r, int jd, int x, int y, LL num) {
- if(x <= l && r <= y) {
- Minn[jd] = std:: min(Minn[jd], (LL)num);
- return ;
- }
- int mid = (l + r) >> ;
- if(x <= mid) Sec_G(l, mid, lson, x, y, num);
- if(y > mid) Sec_G(mid + , r, rson, x, y, num);
- }
- void Dfs_tree(int l, int r, int jd) {
- if(l == r) {
- Ans[l] = Minn[jd];
- return ;
- }
- int mid = (l + r) >> ;
- Minn[lson] = std:: min(Minn[lson], Minn[jd]);
- Minn[rson] = std:: min(Minn[rson], Minn[jd]);
- Dfs_tree(l, mid, lson), Dfs_tree(mid + , r, rson);
- }
- #define gc getchar()
- inline LL read() {
- LL x = ; char c = gc;
- while(c < '' || c > '') c = gc;
- while(c >= '' && c <= '') x = x * + c - '', c = gc;
- return x;
- }
- main() {
- n = read(), m = read();
- for(int i = ; i <= (N << ); i ++) Minn[i] = oo;
- for(int i = ; i <= n; i ++) head[i] = -;
- for(int i = ; i <= m; i ++) {
- int u = read(), v = read(), w = read();
- Add(u, v, w), Add(v, u, w);
- }
- S = read(), T = read();
- if(S == T) {
- int Q = read();
- for(; Q; Q --) puts("");
- return ;
- }
- Dijkstra(S, dis_s);
- Dijkstra(T, dis_t);
- if(dis_s[T] == oo) {
- int Q = read();
- for(; Q; Q --) puts("Infinity");
- return ;
- }
- for(int i = S; i != T; i = i) {
- Short_path[++ path_js] = i;
- Id[i] = path_js;
- for(int j = head[i]; ~ j; j = G[j].nxt) {
- if(dis_t[i] == G[j].w + dis_t[G[j].v]) {
- i = G[j].v; break;
- }
- }
- }
- Short_path[path_js + ] = T, Id[T] = path_js + ;
- for(int i = ; i <= path_js; i ++) Bfs(i, dis_s, Snum);
- for(int i = path_js + ; i >= ; i --) Bfs(i, dis_t, Tnum);
- for(int i = ; i <= n; i ++) {
- for(int j = head[i]; ~ j; j = G[j].nxt) {
- int v = G[j].v;
- if(Id[i] && Id[v] && abs(Id[i] - Id[v]) == ) continue;
- if(Snum[i] < Tnum[v] && Snum[i] && Tnum[v]) {
- Sec_G(, path_js, , Snum[i], Tnum[v] - , dis_s[i] + G[j].w + dis_t[v]);
- }
- }
- }
- Dfs_tree(, path_js, );
- int Q = read();
- for(; Q; Q --) {
- int x = read(), y = read();
- if(Id[x] > Id[y]) std:: swap(x, y);
- if(Id[x] && Id[y] && Id[y] - Id[x] == ) {
- if(Ans[Id[x]] == oo) puts("Infinity");
- else printf("%lld\n", Ans[Id[x]]);
- } else printf("%lld\n", dis_s[T]);
- }
- return ;
- }
bzoj2725的更多相关文章
- 【BZOJ-2725】故乡的梦 Dijsktra + Tarjan + Dinic + BFS + 堆
2725: [Violet 6]故乡的梦 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 502 Solved: 173[Submit][Status ...
- BZOJ2725 : [Violet 6]故乡的梦
如果S==T,那么答案为0. 如果S与T不连通,那么答案为inf. 否则,S到T的最短路径上至少有一条边. 求出以S为源点的最短路图,是个DAG,随便抓一条S到T的最短路,记为P. 设dpS[x]表示 ...
- bzoj4400
/* * 此题同bzoj2725 * 增加了枚举边的操作 */ #include <bits/stdc++.h> ;// oo = 999999999; #define LL long l ...
随机推荐
- asp.net core-14.JWT认证授权 生成 JWT Token
源码下载 语言组织能力不好 ,看这个 视频 用visual studio code打开文件,运行dotnet watch run 之后在postman里面去访问 拿到Token后
- js 监听键盘的enter键
// js 版本 window.onload=function(){ document.onkeydown=function(ev){ var event=ev ||event if(event.ke ...
- Map 集合遍历的4种方法
Map 集合初始化时,指定集合初始值大小. 说明:HashMap 使用 HashMap(int initialCapacity) 初始化. 正例:initialCapacity = (需要存储的元素个 ...
- python练习:函数3
习题: 用lambda和filter完成下面功能:输出一个列表,列表里面包括:1-100内的所有偶数.(提示:可以用filter,lambda) [ x for x in range(1,101) i ...
- c# 163网易发送邮件
是4.0的,说以添加包是 代码: public class SendEmailInfo { /// <summary> /// 发送邮件 /// </summary> /// ...
- vue中使用ts后,父组件获取执行子组件方法报错问题
一.问题产生背景: 子组件的一个方法: update () { this.$nextTick(() => { this.ul_slots.forEach((ul, cur_slots_index ...
- linux服务脚本
#!/bin/sh ARG=$1 case $ARG in start): nohup /path/program & ;; stop): pkill program ;; restart): ...
- Array + two points leetcode.18 - 4Sum
题面 Given an array nums of n integers and an integer target, are there elements a, b, c, and d in num ...
- shell code
- 《数据结构与算法之美》 <04>链表(上):如何实现LRU缓存淘汰算法?
今天我们来聊聊“链表(Linked list)”这个数据结构.学习链表有什么用呢?为了回答这个问题,我们先来讨论一个经典的链表应用场景,那就是 LRU 缓存淘汰算法. 缓存是一种提高数据读取性能的技术 ...