题目是真的长
思路:
这道题求得就是a到l能否到达一步
确定dfs会TLE所以用最短路,floyedT飞,dij+ 堆优化不会,只能用spfa
因为n可能=m会形成环
所以判断奇偶分别求
C o d e Code Code:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
queue<int>hh ;
int n,m,q,u,v,a,l,t;
int dis[200001][2],h[200001];
struct node
{
int w,p;
}e[200001];
void add (int v,int u)
{
e[++t] = (node){v,h[u]}; h[u] = t; //邻接表
return;
}
void spfa()//spfa
{
memset (dis, 127 / 3, sizeof (dis));//初始化
dis[1][0] = 0;
hh.push(1);
while (!hh.empty())
{
int now = hh.front ();
hh.pop ();
for (int i = h[now]; i; i = e[i].p)
{
if (dis[now][0] + 1 < dis[e[i].w][1])
{
dis[e[i].w][1] = dis[now][0] + 1;
hh.push(e[i].w);
}//奇数
if (dis[now][1] + 1 < dis[e[i].w][0])
{
dis[e[i].w][0] = dis[now][1] + 1;
hh.push(e[i].w);
}//偶数
}
}
return;
}
int main ()
{
scanf ("%d%d%d", &n, &m, &q);
for (int i = 1;i <= m; ++i)
{
scanf ("%d%d", &u, &v);
add(v,u);//建图
add(u,v);
}
spfa();
for (int i = 1; i <= q; ++i)
{
scanf("%d%d", &a, &l);
if (dis[a][l % 2] <= l)printf("Yes\n");//判断一下
else printf("No\n");
}
return 0;
}