結果
| 問題 |
No.2674 k-Walk on Bipartite
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2024-02-08 23:26:35 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 197 ms / 2,000 ms |
| コード長 | 1,990 bytes |
| コンパイル時間 | 2,073 ms |
| コンパイル使用メモリ | 200,580 KB |
| 最終ジャッジ日時 | 2025-02-19 02:55:03 |
|
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 36 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
int main() {
int N, M;
cin >> N >> M;
int s, t, k;
cin >> s >> t >> k;
s--;
t--;
vector<int> adj[N];
for (int i = 0; i < M; i++) {
int A, B;
cin >> A >> B;
A--;
B--;
adj[A].push_back(B);
adj[B].push_back(A);
}
// BFS
queue<int> que;
int dist[N] = {};
bool visited[N] = {};
que.push(s);
dist[s] = 0;
visited[s] = true;
while (!que.empty()) {
int v = que.front();
que.pop();
for (auto &&u : adj[v]) {
if (!visited[u]) {
que.push(u);
dist[u] = dist[v] + 1;
visited[u] = true;
}
}
}
// グラフ(V, F)に長さkの歩道が存在する
if (visited[t] && dist[t] <= k && dist[t] % 2 == k % 2 && !adj[s].empty()) {
cout << "Yes" << endl;
return 0;
}
// グラフ(V, F)に長さkの歩道が存在しない
// sとtが連結
if (visited[t]) {
// 最短経路長がkの偶奇と一致しない
if (dist[t] % 2 != k % 2) {
cout << "No" << endl;
return 0;
}
// 最短経路長がkの偶奇と一致する
// s == tのとき,N = 1かで判定
if (s == t) {
cout << (N != 1 ? "Unknown" : "No") << endl;
return 0;
}
// s != tのとき,最短経路長を 1 または 2 にできる
int min_dist = (k % 2 ? 1 : 2);
cout << (min_dist <= k ? "Unknown" : "No") << endl;
return 0;
}
// sとtが非連結
// N = 2 かつ k%2 == 0 のとき別処理
if (N == 2 && k % 2 == 0) {
cout << "No" << endl;
return 0;
}
// それ以外のとき,最短経路長を 1 または 2 の好きな方にできる
int min_dist = (k % 2 ? 1 : 2);
cout << (min_dist <= k ? "Unknown" : "No") << endl;
return 0;
}