D103 BFS最短路 P5663 [CSP-J2019] 加工零件

D103 BFS最短路 P5663 [CSP-J2019] 加工零件_哔哩哔哩_bilibili

 

P5663 [CSP-J2019] 加工零件 - 洛谷

给一个边权为 1 的无向图,相邻点之间存在奇偶性传播,q 次询问:点 a 的数取 L,其奇偶性传播到顶点 1 时 是否为 0。

思路

答案由各点到 1 的距离的奇偶性决定,那么我们就用 BFS 求出各点到 1 的奇数距离 d 和偶数距离 dd

对于询问,如果 L 是奇数且 a 点的奇数距离可达 1 或 L 是偶数且 a 点的偶数距离可达 1,那么输出 Yes,其他输出 No

image

图中,如果 a=5,L=3,那么传播到 1 为 0,Yes;如果 a=5,L=1,那么传播到 4 为 0,No

image

 

// 最短路+奇偶可达性 BFS 算法 O(N+M)
#include<bits/stdc++.h>
using namespace std;

#define N 100010
int idx,h[N],to[N<<1],ne[N<<1];
void add(int x,int y){
  to[++idx]=y;ne[idx]=h[x];h[x]=idx;
}
int n,m,q;
int d[N],dd[N]; //d[u]/dd[u]表示u到1的奇数距离/偶数距离

void bfs(){
  memset(d,0x3f,sizeof(d)); 
  memset(dd,0x3f,sizeof(dd)); dd[1]=0;
  queue<int> q;
  q.push(1);
  while(q.size()){
    int u=q.front(); q.pop();
    for(int i=h[u]; i; i=ne[i]){
      int v=to[i];
      if(dd[v]>d[u]+1) dd[v]=d[u]+1,q.push(v);
      if(d[v]>dd[u]+1) d[v]=dd[u]+1,q.push(v);
    }
  }
}
int main(){
  scanf("%d%d%d",&n,&m,&q);
  for(int i=1,u,v; i<=m; i++){
    scanf("%d%d",&u,&v);
    add(u,v); add(v,u);
  }
  
  bfs();
  for(int i=1,a,L; i<=q; i++){
    scanf("%d%d",&a,&L);
    if(a==1 && !h[1]){ //如果1是孤立点
      puts("No"); continue;
    }
    // L是奇数且a点的奇数距离可达1 或 L是偶数且a点的偶数距离可达1
    if(L%2==1&&d[a]<=L || L%2==0&&dd[a]<=L)puts("Yes");
    else puts("No");
  }
}

 

posted @ 2026-03-12 18:43  董晓  阅读(137)  评论(0)    收藏  举报