This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#define lsb(x) (x & (-x))
#define ll long long
#define ull unsigned long long
// 217
// 44
using namespace std;
const int MAXM = (int) 5e5;
const int MAXN = (int) 1e5;
vector < pair <int, int> > g[MAXN + 1];
int even[MAXN + 1], father[MAXN + 1], n;
bool vis[MAXN + 1];
void dfs(int nod) {
vis[nod] = 1;
for(auto it : g[nod]) {
if(vis[it.first] == 0) {
even[it.first] = (even[nod] ^ 1);
father[it.first] = nod;
dfs(it.first);
}
}
}
inline void detect_cycle(bool &cycle) {
memset(even, -1, sizeof(even));
even[1] = 0;
dfs(1);
int cnt = 0;
for(int i = 1; i <= n; i++) {
for(auto it : g[i]) {
if(even[i] != even[it.first] && !(father[it.first] == i || father[i] == it.first)) {
cout << 0;
exit(0);
}
if(even[i] == even[it.first]) {
cnt++;
}
}
}
cnt /= 2;
if(cnt > 1) {
cout << 0;
exit(0);
}
if(cnt) {
cycle = 1;
}
}
ll c[MAXN + 1];
ll sol[MAXM + 1];
int deg[MAXN + 1];
inline void check() {
for(int i = 1; i <= n; i++) {
if(c[i] != 0) {
while(1) {
}
cout << 0;
exit(0);
}
}
}
inline void solve_tree(bool cycle) {
int i;
memset(vis, 0, sizeof(vis));
queue <int> Q;
for(i = 1; i <= n; i++) {
if(g[i].size() == 1) {
Q.push(i);
vis[i] = 1;
}
}
while(Q.size()) {
int nod = Q.front();
Q.pop();
for(auto it : g[nod]) {
if(vis[it.first] == 0) {
deg[it.first]++;
sol[it.second] = c[nod];
c[it.first] -= c[nod];
c[nod] = 0;
if(deg[it.first] + 1 == g[it.first].size()) {
vis[it.first] = 1;
Q.push(it.first);
}
}
}
}
if(cycle == 0) {
check();
}
}
void dfs1(int nod, vector < pair <int, int> > &nodes, int par, int root) {
vis[nod] = 1;
for(auto it : g[nod]) {
if(it.first == par) {
continue;
}
if(vis[it.first] == 0) {
nodes.push_back({nod, it.second});
dfs1(it.first, nodes, nod, root);
}
else if(it.first == root) {
nodes.push_back({nod, it.second});
}
}
}
inline void solve_cycle(bool cycle) {
if(cycle == 0) {
return ;
}
int i, nod;
for(i = 1; i <= n; i++) {
if(vis[i] == 0) {
nod = i;
break;
}
}
vector < pair <int, int> > nodes;
dfs1(nod, nodes, 0, nod);
int sz = nodes.size();
ll tot = 0;
for(auto it : nodes) {
tot += c[it.first];
}
tot /= 2;
ll sum = 0;
for(i = 0; i + 1 < sz; i += 2) {
sum += c[nodes[i].first];
}
sol[nodes[sz - 2].second] = tot - sum;
c[nodes[sz - 2].first] -= tot - sum;
for(i = sz - 3; i >= 0; i--) {
sol[nodes[i].second] = c[nodes[i + 1].first];
c[nodes[i].first] -= sol[nodes[i].second];
}
sum = 0;
for(auto it : nodes) {
sum += sol[it.second];
}
sol[nodes.back().second] = tot - sum;
}
int main() {
//ifstream cin("A.in");
//ofstream cout("A.out");
int i, m;
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
cin >> n >> m;
for(i = 1; i <= n; i++) {
cin >> c[i];
c[i] *= 2LL;
}
for(i = 1; i <= m; i++) {
int x, y;
cin >> x >> y;
g[x].push_back({y, i});
g[y].push_back({x, i});
}
bool cycle = 0;
detect_cycle(cycle);
solve_tree(cycle);
solve_cycle(cycle);
for(i = 1; i <= m; i++) {
cout << sol[i] << "\n";
}
//cin.close();
//cout.close();
return 0;
}
Compilation message (stderr)
pipes.cpp: In function 'void solve_tree(bool)':
pipes.cpp:90:38: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
if(deg[it.first] + 1 == g[it.first].size()) {
~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~
pipes.cpp: In function 'void solve_cycle(bool)':
pipes.cpp:130:9: warning: 'nod' may be used uninitialized in this function [-Wmaybe-uninitialized]
dfs1(nod, nodes, 0, nod);
~~~~^~~~~~~~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |