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

题意

给定一个图 , 求图中起始点到任意一个节点的奇路径最小值和偶路径最小值

思路

显然是单源最短路问题
由于没有边权 , 所以用bfs即可

代码

#include<bits/stdc++.h>
using namespace std;
#define int long long int

inline int read() {
    int ans = 0, f = 1;
    char ch = getchar();
    while (ch < '0' || ch > '9') {
        if (ch == '-')f = -1;
        ch = getchar();
    }
    while (ch <= '9' && ch >= '0') {
        ans = ans * 10 + ch - '0';
        ch = getchar();
    }
    return ans * f;
}
const int N = 1e5+10;
vector<int> ed[N];
int odd[N],even[N];
typedef pair<int,int> PII;
void bfs() {
    memset(odd,0x3f,sizeof odd);
    memset(even,0x3f,sizeof even);
    queue<PII> q;
    for (auto e : ed[1]) {
        odd[e] = 1;
        q.push({e,1});
    }
    while (q.size()) {
        auto [u,l] = q.front();
        q.pop();
        for (auto e : ed[u]) {
            if (l&1) {
                if (l+1<even[e]) {
                    even[e] = l+1;
                    q.push({e,l+1});
                }
            }
            else if (l + 1 < odd[e]) {
                odd[e] = l+1;
                q.push({e,l+1});
            }
        }
    }
}
signed main() {
    int n=read(),m=read(),q=read();
    for (int i = 1; i<= m;i++) {
        int u =read(),v=read();
        ed[u].push_back(v);
        ed[v].push_back(u);
    }
    bfs();
    while (q--) {
        int a= read(),l=read();
        if ((odd[a]<= l&&l&1)  || (even[a]<=l&&!(l&1))) {
            cout<<"Yes\n";
        }
        else {
            cout<<"No\n";
        }
    }
    return 0;
}
posted @ 2025-05-18 21:53  Guaninf  阅读(11)  评论(0)    收藏  举报