結果
| 問題 | No.2236 Lights Out On Simple Graph |
| コンテスト | |
| ユーザー |
Yudai0606Nazo
|
| 提出日時 | 2023-03-09 20:31:30 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.89.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,442 bytes |
| 記録 | |
| コンパイル時間 | 4,207 ms |
| コンパイル使用メモリ | 272,608 KB |
| 最終ジャッジ日時 | 2025-02-11 07:14:26 |
|
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 48 WA * 9 |
ソースコード
#include <bits/stdc++.h>
#include <atcoder/all>
using namespace std;
using namespace atcoder;
using ll = long long;
using mint = modint998244353;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define repf(i, n, flag) for (int i = 0; i < (int)(n) && flag; i++)
#define all(v) v.begin(), v.end()
const int INF = 1e9;
int main() {
int n, m;
cin >> n >> m;
dsu d(n);
vector dp(n, vector<int>(n, INF));
rep(i, m) {
int a, b;
cin >> a >> b;
a--; b--;
dp[a][b] = dp[b][a] = 1;
d.merge(a, b);
}
int cnt = 0;
vector<int> c(n);
rep(i, n) {
cin >> c[i];
if(c[i] == 1) cnt++;
}
auto grps = d.groups();
for(auto vec: grps) {
int tmp = 0;
for(int x: vec) if(c[x] == 1) tmp++;
if(tmp % 2 != 0) {
cout << -1 << endl;
return 0;
}
}
rep(k, n) rep(i, n) rep(j, n) dp[i][j] = min(dp[i][j], dp[i][k] + dp[k][j]);
mcf_graph<int, int> g(2*n+2);
int s = 2*n, t = s + 1;
rep(i, n) g.add_edge(s, i, 1, 0);
rep(i, n) g.add_edge(n+i, t, 1, 0);
rep(i, n) rep(j, n) {
if(i == j) continue;
if(c[i] == 0) continue;
if(c[j] == 0) continue;
if(dp[i][j] >= INF) continue;
g.add_edge(i, n+j, 1, dp[i][j]);
}
auto res = g.flow(s, t);
if(res.first < cnt) cout << -1 << endl;
else cout << res.second / 2 << endl;
}
Yudai0606Nazo