1 条题解
-
1
#include <vector> #include <queue> #include <cstring> using namespace std; const int MAXN = 100005; const int INF = 0x3f3f3f3f; vector<int> G[MAXN]; int dis0[MAXN]; //到u最短偶数步 int dis1[MAXN]; //到u最短奇数步 int main() { ios::sync_with_stdio(false); cin.tie(0); int n, m, q; cin >> n >> m >> q; for(int i = 0; i < m; ++i) { int u, v; cin >> u >> v; G[u].push_back(v); G[v].push_back(u); } memset(dis0, 0x3f, sizeof dis0); memset(dis1, 0x3f, sizeof dis1); queue<pair<int,int>> qb; dis0[1] = 0; qb.push({1,0}); while(!qb.empty()) { auto cur = qb.front(); qb.pop(); int u = cur.first; int s = cur.second; //0偶 1奇 int d = (s ==0) ? dis0[u] : dis1[u]; for(int v : G[u]) { int ns = 1 - s; if(ns == 0) { if(dis0[v] > d + 1) { dis0[v] = d + 1; qb.push({v,0}); } } else { if(dis1[v] > d + 1) { dis1[v] = d + 1; qb.push({v,1}); } } } } while(q--) { int a, L; cin >> a >> L; bool ok = false; if(L %2 ==1) { if(dis1[a] != INF && dis1[a] <= L) ok = true; } else { if(dis0[a] != INF && dis0[a] <= L) ok = true; } if(ok) cout << "Yes\n"; else cout << "No\n"; } return 0; }
- 1
信息
- ID
- 788
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- 递交数
- 205
- 已通过
- 8
- 上传者