이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
const int N = 100005;
int n, m;
int a[N];
int par[N];
int deg[N];
int res[N];
bool vis[N];
vector< pair<int, int> > G[N];
map< pair<int, int>, int > mp;
int main() {
ios::sync_with_stdio(false);
cin >> n >> m;
if (m > n) {
cout << 0; return 0;
}
for (int i = 1; i <= n; ++i) cin >> a[i];
for (int i = 1; i <= m; ++i) {
int u, v; cin >> u >> v;
G[u].push_back({v, i});
G[v].push_back({u, i});
deg[u]++, deg[v]++;
mp[{u, v}] = mp[{v, u}] = i;
}
queue<int> qu;
for (int i = 1; i <= n; ++i) {
if (deg[i] == 1) qu.push(i);
}
while (qu.size()) {
int u = qu.front(); qu.pop();
for (auto v : G[u]) {
if (par[v.first] == u) continue;
deg[v.first]--, par[u] = v.first;
a[v.first] -= a[u], res[v.second] = a[u];
if (deg[v.first] == 1) qu.push(v.first);
}
}
for (int i = 1; i <= n; ++i) {
if (deg[i] != 2) continue;
int u = i;
vector<int> ver;
while (1) {
bool found = 0;
vis[u] = 1, ver.push_back(u);
for (auto v : G[u]) {
if (deg[v.first] == 2 && !vis[v.first]) {
u = v.first, found = 1; break;
}
}
if (!found) break;
}
int sz = ver.size();
if (sz % 2 == 0) {
cout << 0; return 0;
}
vector<int> edg;
for (int j = 0; j < sz; ++j) {
edg.push_back(mp[{ver[j], ver[(j + 1) % sz]}]);
}
res[edg[0]] = 0;
for (int j = 1; j < sz; ++j) {
res[edg[j]] = a[ver[j]] - res[edg[j - 1]];
}
if ((res[edg[sz - 1]] & 1) != (a[ver[0]] & 1)) {
cout << 0; return 0;
}
res[edg[0]] = (a[ver[0]] - res[edg[sz - 1]]) / 2;
for (int j = 1; j < sz; ++j) {
res[edg[j]] = a[ver[j]] - res[edg[j - 1]];
}
break;
}
for (int i = 1; i <= m; ++i) cout << res[i] * 2 << ' ';
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |