加工零件
方法一
/*
整体思路:
1.计算出1到其他任意点的奇数最短路径和偶数最短路径
2.如果询问的点为X,长度为L。 L为偶数,1到X的偶数最短路径应该大于等于L;
L为奇数,1到X的奇数最短路径应该大于等于L,如果小于肯定输出NO表示不能到达
*/
#include<bits/stdc++.h>
#define UP(i,x,y) for(int i=x; i<=y; i++)
#define INF 2139062143
using namespace std;
vector<int> myMap[100005];
int N,M,Q;
int shortPath[100000][2];
queue< pair<int, int> > que;
/* 从1到e的最短路径 */
void bfs()
{
int head;
int step;
while(!que.empty())
{
/* 拿出队头的结点和步数 */
head = que.front().first;
step = que.front().second;
for(vector<int>::iterator u = myMap[head].begin(); u!=myMap[head].end(); ++u)
{
/* 重点!只有找到当前的最短步数才入队,这样的好处是不会走回头路,
因为走了回头路的话步数肯定会大于之前的最短路。 */
/* 如果步数为偶数,并且是最短的 ,入队并且记录最短路*/
if((step+1) % 2 == 0 and step+1 < shortPath[*u][0