BZOJ 2725 [Violet 6]故乡的梦 线段树+最短路树
\(\color{#0066ff}{ 题目描述 }\)
.gif)
\(\color{#0066ff}{输入格式}\)
.gif)
\(\color{#0066ff}{输出格式}\)
.gif)
\(\color{#0066ff}{输入样例}\)
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 3
6 5
\(\color{#0066ff}{输出样例}\)
7
6
Infinity
7
\(\color{#0066ff}{数据范围与提示}\)
.gif)
\(\color{#0066ff}{ 题解 }\)
分别从s和t跑最短路,构建出最短路树
标记最短路树的点和边

从最短路树上的每个点bfs,找到能影响的L和R
显然若上图a,b之间的某条边断了,x到y的边就可以用来更新这部分答案
从a找到所有x,b找到所有y
枚举所有边,只要不在最短路树上,就类似于上图更新(用线段树维护)
在\(O(nlogn)\)的复杂度下求出删去每条最短路树上的边的ans
对于询问,如果不是最短路树的边,ans就是最短路
否则用刚刚在线段树求的ans输出
跑dij的pair要开long long!!!!
#include<bits/stdc++.h>
#define LL long long
LL in() {
	char ch; LL x = 0, f = 1;
	while(!isdigit(ch = getchar()))(ch == '-') && (f = -f);
	for(x = ch ^ 48; isdigit(ch = getchar()); x = (x << 1) + (x << 3) + (ch ^ 48));
	return x * f;
}
const int maxn = 2e6 + 100;
int L[maxn], R[maxn], S, T;
int n, m;
struct node {
	int to;
	LL dis;
	bool vis;
	node *nxt;
	node(int to = 0, LL dis = 0, bool vis = false, node *nxt = NULL): to(to), dis(dis), vis(vis), nxt(nxt) {}
};
node *head[maxn];
bool vis[maxn];
LL diss[maxn], dist[maxn];
int st[maxn], cnt, rst[maxn];
LL ans[maxn];
const LL inf = 9999999999999LL;
using std::pair;
using std::make_pair;
struct Tree {
	Tree *ch[2];
	LL val;
	int l, r;
	Tree(LL val = 0, int l = 0, int r = 0): val(val), l(l), r(r) {}
}*root;
void build(Tree *&o, int l, int r) {
	o = new Tree(inf, l, r);
	if(l == r) return;
	int mid = (l + r) >> 1;
	build(o->ch[0], l, mid);
	build(o->ch[1], mid + 1, r);
}
void add(int from, int to, LL dis) {
	head[from] = new node(to, dis, 0, head[from]);
}
void dij(int s, LL *dis) {
	std::priority_queue<pair<LL, int>, std::vector<pair<LL, int> >, std::greater<pair<LL, int> > > q;
	for(int i = 1; i <= n; i++) vis[i] = 0, dis[i] = inf;
	q.push(make_pair(dis[s] = 0, s));
	while(!q.empty()) {
		int tp = q.top().second;
		q.pop();
		if(vis[tp]) continue;
		vis[tp] = true;
		for(node *i = head[tp]; i; i = i->nxt)
			if(dis[i->to] > dis[tp] + i->dis)
				q.push(make_pair(dis[i->to] = dis[tp] + i->dis, i->to));
	}
}
void bfs(int s, int *P, LL *dis) {
	std::queue<int> v;
	P[st[s]] = s;
	v.push(st[s]);
	while(!v.empty()) {
		int tp = v.front(); v.pop();
		for(node *i = head[tp]; i; i = i->nxt) {
			if(dis[i->to] == dis[tp] + i->dis && !vis[i->to] && !P[i->to]) {
				P[i->to] = s;
				v.push(i->to);
			}
		}
	}
}
void change(Tree *o, int l, int r, LL val) {
	if(o->r < l || o->l > r) return;
	if(l <= o->l && o->r <= r) return (void)(o->val = std::min(o->val, val));
	change(o->ch[0], l, r, val), change(o->ch[1], l, r, val);
}
void query(Tree *o) {
	if(o->l == o->r) return (void)(ans[o->l] = o->val);
	o->ch[0]->val = std::min(o->ch[0]->val, o->val);
	o->ch[1]->val = std::min(o->ch[1]->val, o->val);
	query(o->ch[0]);
	query(o->ch[1]);
}
int main() {
	n = in(), m = in();
	LL x, y, z;
	for(int i = 1; i <= m; i++) {
		x = in(), y = in(), z = in();
		add(x, y, z), add(y, x, z);
	}
	dij(S = in(), diss);
	dij(T = in(), dist);
	for(int i = 1; i <= n; i++) vis[i] = 0;
	for(int o = S; o != T;) {
		st[rst[o] = ++cnt] = o;
		vis[o] = true;
		for(node *i = head[o]; i; i = i->nxt) {
			if(diss[o] + dist[i->to] + i->dis == diss[T]) {
				i->vis = true;
				o = i->to;
				break;
			}
		}
	}
	st[rst[T] = ++cnt] = T;
	vis[T] = true;
	for(int i = 1; i <= cnt; i++) bfs(i, L, diss);
	for(int i = cnt; i >= 1; i--) bfs(i, R, dist);
	build(root, 1, cnt);
	for(int i = 1; i <= n; i++)
		for(node *j = head[i]; j; j = j->nxt) {
			if(j->vis) continue;
			if(L[i] < R[j->to] && L[i] && R[j->to]) change(root, L[i], R[j->to] - 1, diss[i] + dist[j->to] + j->dis);
		}
	query(root);
	for(int q = in(); q --> 0;) {
		x = in(), y = in();
		if(rst[x] > 0 && rst[y] > 0 && abs(rst[x] - rst[y]) == 1) {
			LL t = ans[std::min(rst[x], rst[y])];
			if(t == inf) printf("Infinity\n");
			else printf("%lld\n", t);
		}
		else if(diss[T] == inf) printf("Infinty\n");
		else printf("%lld\n", diss[T]);
	}
	return 0;
}
												
											BZOJ 2725 [Violet 6]故乡的梦 线段树+最短路树的更多相关文章
- BZOJ 2725: [Violet 6]故乡的梦 最短路+线段树
		
2725: [Violet 6]故乡的梦 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 678 Solved: 204[Submit][Status ...
 - BZOJ 2725: [Violet 6]故乡的梦
		
求出最短路径树,对于一个询问(x,y) 若不在树上S->T的链上,则答案不变,若在链上,考虑用一条非树边替换这条边,这条非树边必须跨越x->y这条边,线段树维护区间最小值 #include ...
 - [原博客] BZOJ 2725 : [Violet 6]故乡的梦
		
这个题在bzoj上好像是个权限题,想做的可以去Vani的博客下载测试数据.这里有题面. 简单叙述一下题意:给你一个n个点.m条边的带权无向图,S点和T点,询问Q次删一条给定的边的S-T最短路. 其中 ...
 - [BZOJ 3123] [SDOI 2013]森林(可持久化线段树+并查集+启发式合并)
		
[BZOJ 3123] [SDOI 2013]森林(可持久化线段树+启发式合并) 题面 给出一个n个节点m条边的森林,每个节点都有一个权值.有两种操作: Q x y k查询点x到点y路径上所有的权值中 ...
 - BZOJ2725 : [Violet 6]故乡的梦
		
如果S==T,那么答案为0. 如果S与T不连通,那么答案为inf. 否则,S到T的最短路径上至少有一条边. 求出以S为源点的最短路图,是个DAG,随便抓一条S到T的最短路,记为P. 设dpS[x]表示 ...
 - BZOJ.5110.[CodePlus2017]Yazid 的新生舞会(线段树/树状数组/分治)
		
LOJ BZOJ 洛谷 又来发良心题解啦 \(Description\) 给定一个序列\(A_i\).求有多少个子区间,满足该区间众数出现次数大于区间长度的一半. \(n\leq5\times10^5 ...
 - BZOJ.2653.[国家集训队]middle(可持久化线段树 二分)
		
BZOJ 洛谷 求中位数除了\(sort\)还有什么方法?二分一个数\(x\),把\(<x\)的数全设成\(-1\),\(\geq x\)的数设成\(1\),判断序列和是否非负. 对于询问\(( ...
 - BZOJ 5168 && Luogu P3740 [HAOI2014]贴海报 线段树~~
		
据说某谷数据十分水...但幸好BZOJ上也过了...话说我记得讲课时讲的是奇奇怪怪的离散化..但现在突然觉得什么都可以线段树瞎搞了...QAQ 直接就是这个区间有没有被覆盖,被覆盖直接return: ...
 - BZOJ 3878 [AHOI&JSOI2014]奇怪的计算器 (线段树)
		
题面:BZOJ传送门 洛谷传送门 线段树好题 题目保证$a$一定是正整数,容易发现计算结果是单调的 我们把询问离线,并按照从小到大排序 某次操作可能导致某些位置达到边界$L/R$ 根据单调性的结论 这 ...
 
随机推荐
- 侯捷STL学习(四)--OOP-GP/操作符重载-泛化特化
			
C++标准库第二讲 体系结构与内核分析 第1-7节为第一讲 读源代码前的准备 第八节:源代码分布 C++基本语法 模板的使用 数据结构和算法 本课程主要使用:Gnu C 2.9.1与Gun C 4.9 ...
 - 【转】MEAN:Nodejs+express+angularjs+mongodb搭建前端项目框架NJBlog
			
http://www.cnblogs.com/mz121star/archive/2013/03/13/njblog.html 项目地址:https://github.com/mz121star/ ...
 - 发RTX通知
			
安装sdk 在RTXServer目录下找到WebRoot目录,找到里面的SendNotify.cgi(就是一个php页面,默认是pc - ascii编码).打开页面,在头部加上编码信息 header( ...
 - Python中str.format()字典及list传入详解
 - LAMP  2.4 Apache访问控制
			
通过查看日志发现有个IP 恶意攻击你的网址,可以控制这个IP的访问. 打开主配置文件复制模板. vim /usr/local/apache2/conf/httpd.conf 搜索 /Order 复制 ...
 - myeclipse 10破解
			
因为笔者的电脑是刚买不久,忘记先给电脑分区,等软年安装差不多了才发现忘记分区,所以就备份了数据,然后分区,结果分区过程中没有异常发生,就没用备用数据,就用分过区的原数据,当时还以为没问题,结果打开my ...
 - Mysql   Hive  通用的行列转换
			
就是简单的一个字符串拼接,意义和所用场景自己体会下 insert into table agent_library1 select concat_ws(':',collect_set(name)) a ...
 - PLM数据库迁移注意事项
			
需求: PLM应用程序与数据库是存放在同一台服务器上,现需要将数据库迁移到数据库服务器10.10.1.10中. 10.10.1.10中安装了三个实例,MSSQLSERVER.MSSQLSERVER_P ...
 - js对象简单、深度克隆(复制)
			
javascript的一切实例都是对象,只是对象之间稍有不同,分为原始类型和合成类型.原始类型对象指的是字符串(String).数值(Number).布尔值(Boolean),合成类型对象指的是数组( ...
 - css知多少(4)——解读浏览器默认样式(转)
			
css知多少(4)——解读浏览器默认样式 上一节<css知多少(3)——样式来源与层叠规则>介绍了样式的五种来源,咱们再通过一张图回顾一下. 对于上面的三层,咱们大概都比较熟悉了.下面 ...