1 条题解

  • 0
    @ 2026-6-17 1:21:11

    // 最短路+奇偶可达性 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");
      }
    }
    
    • 1

    D103 BFS最短路[CSP-J 2019] 加工零件

    信息

    ID
    1993
    时间
    1000ms
    内存
    250MiB
    难度
    9
    标签
    递交数
    10
    已通过
    4
    上传者