結果
| 問題 | No.3508 OR Mapping |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2026-04-18 23:36:02 |
| 言語 | C++23 (gcc 15.2.0 + boost 1.89.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,687 bytes |
| 記録 | |
| コンパイル時間 | 3,690 ms |
| コンパイル使用メモリ | 346,688 KB |
| 実行使用メモリ | 138,432 KB |
| 最終ジャッジ日時 | 2026-04-18 23:37:51 |
| 合計ジャッジ時間 | 17,802 ms |
|
ジャッジサーバーID (参考情報) |
judge2_0 / judge3_1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 50 WA * 15 |
ソースコード
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
struct SCC {
int n;
vector<vector<int>> g, rg;
vector<int> vs, cmp;
vector<bool> used;
SCC(int n) : n(n), g(n), rg(n), cmp(n), used(n) {}
void add_edge(int from, int to) {
g[from].push_back(to);
rg[to].push_back(from);
}
void dfs(int v) {
used[v] = true;
for (int next : g[v]) if (!used[next]) dfs(next);
vs.push_back(v);
}
void rdfs(int v, int k) {
used[v] = true;
cmp[v] = k;
for (int next : rg[v]) if (!used[next]) rdfs(next, k);
}
int sol() {
fill(used.begin(), used.end(), false);
for (int v = 0; v < n; v++) if (!used[v]) dfs(v);
fill(used.begin(), used.end(), false);
int k = 0;
reverse(vs.begin(), vs.end());
for (int v : vs) if (!used[v]) rdfs(v, k++);
return k;
}
};
ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; }
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int N, M, K;
cin >> N >> M >> K;
SCC scc(N);
for (int i = 0; i < M; i++) {
int u, v; cin >> u >> v;
u--; v--;
scc.add_edge(u, v);
}
int num = scc.sol();
vector<vector<int>> X(num);
for (int i = 0; i < N; i++) X[scc.cmp[i]].push_back(i);
//ok
vector<bool> ok(N, false);
vector<int> q;
ok[0] = true;
q.push_back(0);
for(int i=0; i<(int)q.size(); ++i){
for(int next : scc.g[q[i]]) if(!ok[next]){
ok[next] = true;
q.push_back(next);
}
}
//しゅうき
vector<ll> dist(N, -1);
vector<ll> A(num, 0);
for (int i = 0; i < num; i++) {
if (X[i].empty()) continue;
int root = X[i][0];
dist[root] = 0;
vector<int> st = {root};
int top = 0;
while(top < (int)st.size()){
int v = st[top++];
for(int next : scc.g[v]){
if(scc.cmp[next] != i) continue;
if(dist[next] == -1){
dist[next] = dist[v] + 1;
st.push_back(next);
} else {
ll d = abs(dist[next] - (dist[v] + 1));
A[i] = gcd(A[i], d);
}
}
}
}
vector<bool> ok2(num, false);
for (int i = 0; i < num; i++) {
if (A[i] > 0 && A[i] % 2 != 0) {
ok2[i] = true;
}
}
for (int i = 0; i < N; i++) {
if (ok[i]) {
if (!ok2[scc.cmp[i]]) {
cout << "No" << endl;
return 0;
}
}
}
cout << "Yes" << endl;
return 0;
}