洛谷 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;
}

浙公网安备 33010602011771号