关闭

BZOJ3417: Poi2013 Tales of seafaring

标签: BZOJpoispfaBFS
434人阅读 评论(0) 收藏 举报
分类:

题目大意:给n个点m条边无向图,每次询问两个点之间是否有长度为d的路径(不一定是简单路径)

 

从a到b假如有长度为x的路径,那就可以往回走一步再往前走一步得到长度为x+2的路径

所以可以求出每对点之间的奇数长度最短路和偶数长度最短路,然后判断是否小于d即可

PS:

1.这题卡内存,所以必须离线之后一个点一个点的枚举起点算完之后重新利用内存

2.会有单点不与外界联通并查询这个单点自己之间是否有长度为d的情况,需要特判!

 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 10010
#define M 1000010
using namespace std;
int to[N<<1],nxt[N<<1],pre[N],cnt;
void ae(int ff,int tt)
{
	cnt++;
	to[cnt]=tt;
	nxt[cnt]=pre[ff];
	pre[ff]=cnt;
}
struct ppp{int a,b,k,num;}a[M];
bool cmp(ppp x,ppp y){return x.a<y.a;}
int d[N],q[N*10];
void spfa(int S)
{
	int h=1,t=1;
	memset(d,0x3f,sizeof(d));
	q[1]=S;d[S]=0;
	int i,j,x;
	while(h<=t)
	{
		x=q[h];h++;
		for(i=pre[x];i;i=nxt[i])
		{
			j=to[i];
			if(d[j]!=0x3f3f3f3f) continue;
			d[j]=d[x]+1;
			t++;q[t]=j;
		}
	}
}
bool ans[M];
int main()
{
	int n,m,k;
	scanf("%d%d%d",&n,&m,&k);
	int i,j,x,y;
	for(i=1;i<=m;i++)
	{
		scanf("%d%d",&x,&y);
		ae(x,y+n);ae(x+n,y);
		ae(y,x+n);ae(y+n,x);
	}
	for(i=1;i<=k;i++)
	scanf("%d%d%d",&a[i].a,&a[i].b,&a[i].k),a[i].num=i;
	sort(a+1,a+k+1,cmp);
	j=1;
	for(i=1;i<=n;i++)
	{
		spfa(i);
		while(a[j].a==i)
		{
			if(a[j].a==a[j].b&&!pre[a[j].a])
			{
				if(a[j].k==0) ans[a[j].num]=true;
				else ans[a[j].num]=false;
			}
			else
			{
				if(a[j].k&1)
				{
					if(d[a[j].b+n]<=a[j].k) 
					ans[a[j].num]=true;
				}
				else
				{
					if(d[a[j].b]<=a[j].k)
					ans[a[j].num]=true;
				}
			}
			j++;
		}
	}
	for(i=1;i<=k;i++)
	if(ans[i]) puts("TAK");
	else puts("NIE");
}


 

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

BZOJ3417 Poi2013 Tales of seafaring

我们可以在两个点之间来回反复,所以问题就变成了判断两点之间道路条数为奇数或偶数的最短路是否小于等于d 分成图,边都跨层连,即可算出奇数最短路和偶数最短路 注意特判孤立点询问自己的情况 #incl...
  • neither_nor
  • neither_nor
  • 2016-09-22 14:19
  • 421

BZOJ3414: Poi2013 Inspector

题目大意:一天公司有n个员工和m个员工记录,每个员工只会在连续的一段时间内工作。现在给出m条记录分别是谁写的、什么时候写的以及写的时候除了他还有多少人。求最大的k使得前k条记录互不矛盾   挺神的...
  • commonc
  • commonc
  • 2016-05-31 19:52
  • 578

bzoj 3417: Poi2013 Tales of seafaring bfs

题意一个n点m边无向图,边权均为1,有k个询问,每次询问给出(s,t,d),要求回答是否存在一条从s到t的路径,长度为d,路径不必是简单路(可以自交)。 n,m<=5000,k<=1000000,d...
  • qq_33229466
  • qq_33229466
  • 2016-12-14 19:30
  • 284

【POJ3417】Network-LCA算法+树上差分

【POJ3417】Network-LCA算法+树上差分
  • Maxwei_wzj
  • Maxwei_wzj
  • 2016-08-06 19:07
  • 252

POJ 3417 Network(在线倍增LCA+树形DP)

Description 先给出一棵有n个节点的无根树,然后下面再给出m条边,把这m条边连上,现在可以去掉一条树边和一条新边,问有多少种方案能使树断裂 Input 第一行为两个整数n和m分别表示树...
  • V5ZSQ
  • V5ZSQ
  • 2016-01-05 16:29
  • 288

poj 3417 Network(统计边被环覆盖的次数)

Network Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 3460   Accept...
  • WEYuLi
  • WEYuLi
  • 2013-08-21 13:30
  • 592

poj 3417 Network 【LCA】【树中增新边后 求每条树边被环所覆盖的次数】

Network Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4251   Accept...
  • chenzhenyu123456
  • chenzhenyu123456
  • 2015-08-15 19:15
  • 549

POJ 3417 删边求不连通方法 LCA转RMQ+树型dp

题意: n个点m条无向边 下面n-1行给定原树 m行给定新边   问删一条老边和新边使得图不连通的方法   首先,对于一条新边(u,v),加入后 成环 u, v, LCA(u,v) 所以删除新边(a,...
  • qq574857122
  • qq574857122
  • 2013-11-12 22:09
  • 1671
    个人资料
    • 访问:92969次
    • 积分:2435
    • 等级:
    • 排名:第17611名
    • 原创:156篇
    • 转载:3篇
    • 译文:0篇
    • 评论:27条