結果
問題 | No.2674 k-Walk on Bipartite |
ユーザー |
|
提出日時 | 2024-03-15 22:15:18 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 77 ms / 2,000 ms |
コード長 | 2,085 bytes |
コンパイル時間 | 1,919 ms |
コンパイル使用メモリ | 208,560 KB |
最終ジャッジ日時 | 2025-02-20 05:20:28 |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 36 |
ソースコード
#include <bits/stdc++.h>using namespace std;class UnionFind{public:vector<int> par,siz;void make(int N){par.resize(N,-1);siz.resize(N,1);}int root(int x){if(par.at(x) == -1) return x;else return par.at(x) = root(par.at(x));}void unite(int u, int v){u = root(u),v = root(v);if(u == v) return;if(siz.at(u) < siz.at(v)) swap(u,v);par.at(v) = u;siz.at(u) += siz.at(v);}bool issame(int u, int v){if(root(u) == root(v)) return true;else return false;}};int main() {ios_base::sync_with_stdio(false);cin.tie(nullptr);int N,M; cin >> N >> M;int s,t,k; cin >> s >> t >> k;s--; t--;UnionFind Z; Z.make(N);vector<vector<int>> Graph(N);for(int i=0; i<M; i++){int u,v; cin >> u >> v;u--; v--;Z.unite(u,v);Graph.at(u).push_back(v);Graph.at(v).push_back(u);}if(N == 1){cout << "No" << endl; return 0;}if(Z.issame(s,t) == false){if(N == 2 && k%2 == 0) cout << "No" << endl;else cout << "Unknown" << endl;return 0;}if(s == t){if(k%2) cout << "No" << endl;else if(Graph.at(s).size() == 0) cout << "Unknown" << endl;else cout << "Yes" << endl;return 0;}if(N == 2){if(k%2 == 0) cout << "No" << endl;else cout << "Yes" << endl;return 0;}vector<int> color(N,-1),dist(N,-1);color.at(s) = 0; dist.at(s) = 0;queue<int> Q; Q.push(s);while(Q.size()){int pos = Q.front(); Q.pop();int d = dist.at(pos),c = color.at(pos);for(auto to : Graph.at(pos)){if(dist.at(to) != -1) continue;dist.at(to) = d+1; color.at(to) = c^1;Q.push(to);}}int diffc = 0;if(color.at(s) != color.at(t)) diffc = 1;if(k%2 != diffc) cout << "No" << endl;else if(dist.at(t) <= k) cout << "Yes" << endl;else cout << "Unknown" << endl;}