【BZOJ3417】Poi2013 Tales of seafaring 分层图BFS

【BZOJ3417】Poi2013 Tales of seafaring

Description

一个n点m边无向图,边权均为1,有k个询问

每次询问给出(s,t,d),要求回答是否存在一条从s到t的路径,长度为d

路径不必是简单路(可以自交)

2<=N<=5000,1<=M<=5000,1<=K<=1000000,1<=d<=1000000000

Sample Input

8 7 4
1 2
2 3
3 4
5 6
6 7
7 8
8 5
2 3 1
1 4 1
5 5 8
1 8 10

Sample Output

TAK
NIE
TAK
NIE

题解:由于可以走重复的边,所以我们可以先走最短路过去,然后不断重复走同一条边。然而这样就对最短路长度的奇偶性有要求。所以我们将图分层,维护每个点到其他点的长度为奇数和偶数的最短路,用BFS即可。

然而本题卡空间所以要将询问离线。

还要特判从一个点走到自身,且这个点没有出边的情况。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
using namespace std;
const int maxn=5010;
int n,m,k,cnt;
int to[maxn<<1],next[maxn<<1],head[maxn],dis[maxn][2],ans[1000010];
queue<int> qx,qy;
struct node
{
	int x,v,org;
	node() {}
	node(int a,int b,int c) {x=a,v=b,org=c;}
};
vector<node> p[maxn];
inline int rd()
{
	int ret=0,f=1;	char gc=getchar();
	while(gc<‘0‘||gc>‘9‘)	{if(gc==‘-‘)	f=-f;	gc=getchar();}
	while(gc>=‘0‘&&gc<=‘9‘)	ret=ret*10+(gc^‘0‘),gc=getchar();
	return ret*f;
}
inline void add(int a,int b)
{
	to[cnt]=b,next[cnt]=head[a],head[a]=cnt++;
}
int main()
{
	memset(head,-1,sizeof(head));
	register int i,j,a,b,c;
	n=rd(),m=rd(),k=rd();
	for(i=1;i<=m;i++)	a=rd(),b=rd(),add(a,b),add(b,a);
	for(i=1;i<=k;i++)	a=rd(),b=rd(),c=rd(),p[a].push_back(node(b,c,i));
	for(i=1;i<=n;i++)	if(p[i].size())
	{
		memset(dis,-1,sizeof(dis));
		dis[i][0]=0,qx.push(i),qy.push(0);
		while(!qx.empty())
		{
			a=qx.front(),b=qy.front(),qx.pop(),qy.pop();
			for(j=head[a];j!=-1;j=next[j])	if(dis[to[j]][b^1]==-1)
				dis[to[j]][b^1]=dis[a][b]+1,qx.push(to[j]),qy.push(b^1);
		}
		for(j=0;j<(int)p[i].size();j++)	if(dis[p[i][j].x][p[i][j].v&1]!=-1&&dis[p[i][j].x][p[i][j].v&1]<=p[i][j].v)
		{
			if(head[i]!=-1)	ans[p[i][j].org]=1;
		}
	}
	for(i=1;i<=k;i++)
	{
		if(ans[i])	printf("TAK\n");
		else	printf("NIE\n");
	}
	return 0;
}
时间: 2024-08-30 01:23:27

【BZOJ3417】Poi2013 Tales of seafaring 分层图BFS的相关文章

(离线处理+BFS) poi Tales of seafaring

Tales of seafaring Memory limit: 128 MB Young Bytensson loves to hang out in the port tavern, where he often listens to the sea dogs telling their tales of seafaring. Initially, he believed them all, however incredible they sounded. Over time though,

「hdu 4845 」拯救大兵瑞恩(状态压缩bfs | 分层图思想)

首先关于分层图思想详见2004的这个论文 https://wenku.baidu.com/view/dc57f205cc175527072208ad.html 这道题可以用状态压缩,我们对于每一把钥匙的状态只有两种,获得了或者没有获得,然后就可以用二进制方法表示,例如一共有5把钥匙,我们如果用二进制数01001表示当前状态,就意味着我们已经拥有了第一类钥匙,第四类钥匙(从右往左看),然后我们就可以把此时的状态压缩为一个int了,节省了很多的空间,具体的操作就用位运算实现. 然后就是简单粗暴的df

poj3635Full Tank?[分层图最短路]

Full Tank? Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7248   Accepted: 2338 Description After going through the receipts from your car trip through Europe this summer, you realised that the gas prices varied between the cities you v

【题解】P3645 [APIO2015]雅加达的摩天楼(分层图最短路)

[题解]P3645 [APIO2015]雅加达的摩天楼(分层图最短路) 感觉分层图是个很灵活的东西 直接连边的话,边数是$O(n^2)$的过不去 然而我们有一个优化的办法,可以建一个新图$G=(V,E)$其中$V$和原图$V$一一对应且连接一个$0$边,此外每个点向V中的$i+-d$连边. 类似网络流的办法瞎建就行了. 过不了uoj //@winlere #include<iostream> #include<cstdio> #include<cstring> #inc

【题解】gym102361E Escape(分层图)

[题解]gym102361E Escape(分层图) https://vjudge.net/problem/Gym-102361E 容易证明不会存在共用转换器的合法方案,因为出口互不相同且一旦共用转换器,要么以后走一样的路(这样就到最后两个机器人到了一个出口),要么有一个机器人的路径是非法的(同理). 由此可以推断一段路径最多只会被一个机器人覆盖(路径相交不算) 这道题最主要是观察到这个性质.然后就可以做了. 建立两张网格图G1和G2,一张图只有上下的边,另一张图只有左右的边.两张图的对应格子连

【BZOJ-3627】路径规划 分层图 + Dijkstra + spfa

3627: [JLOI2014]路径规划 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 186  Solved: 70[Submit][Status][Discuss] Description 相信大家都用过地图上的路径规划功能,只要输入起点终点就能找出一条最优路线.现在告诉你一张地图的信息,请你找出最优路径(即最短路径).考虑到实际情况,一辆车加满油能开的时间有限,所以在地图上增加了几个加油站. 地图由点和双向边构成,每个点代表一个路口,也有可

网络流24题 之十四 孤岛营救问题 分层图

题目大意:一张网格图,上面有一些点可能有某种钥匙.节点和节点之间可能有门.有些门须要特定的钥匙就能够通过,有些不管怎样都过不去.求从(1,1)開始到(m,n)的最短时间. 思路:分层图+状态压缩. f[i][j][k],当中i和j描写叙述的是当前所在的位置.k是压缩了的当前有哪些钥匙(因为钥匙的数量<=10,所以全部的状态1<<10的空间内就能够搞定).然后向四个方向更新的时候推断能否经过门. CODE: #include <queue> #include <cstdi

生化危机 邻接表存图+BFS

生化危机 发布时间: 2015年10月10日 18:05   时间限制: 1000ms   内存限制: 256M 描述 X博士想造福人类, 研发一种可以再生肢体的药物, 可是很不幸......研究失败了, 他在蜥蜴身上实验的时候, 蜥蜴发生了变异, 更糟糕的是, 蜥蜴逃出了生化实验室. 恐怖的事情发生了, 疫情以X博士所在的城市为中心向四周扩散开, 最终, 整个地球上的城市都被感染了.假设整个地球一共有N个城市, 这N个城市是连通的, 有N-1条通道把他们连接起来.病毒会以一座城市为中心,在一天

BZOJ 2763 分层图最短路

突然发现我不会分层图最短路,写一发. 就是同层中用双向边相连,用单向边连下一层 1 #include <cstdio> 2 #include <algorithm> 3 #include <iostream> 4 #include <string> 5 #include <cstring> 6 #include <queue> 7 #include <vector> 8 #define pa pair<int,int