Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cmath>
- #include <iostream>
- #include <vector>
- #include <algorithm>
- #include <string>
- #include <set>
- #include <map>
- #include <list>
- #include <time.h>
- #include <math.h>
- #include <random>
- #include <deque>
- #include <queue>
- #include <cassert>
- #include <unordered_map>
- #include <iomanip>
- #include <bitset>
- using namespace std;
- typedef long long ll;
- mt19937 rnd(228);
- const int N = 1e5 + 7;
- vector <pair <int, int> > g[N];
- ll c[N];
- ll cur[N];
- ll ans[N];
- bool u[N];
- int col[N];
- int par[N];
- int d[N];
- int par_ind[N];
- int s = -1, t = -1;
- int edge_ind = -1;
- void dfs(int v)
- {
- u[v] = true;
- for (auto x : g[v])
- {
- int to = x.first, ind = x.second;
- if (!u[to])
- {
- d[to] = d[v] + 1;
- col[to] = (col[v] ^ 1);
- par[to] = v;
- par_ind[to] = ind;
- dfs(to);
- ans[ind] = cur[to];
- cur[v] -= cur[to];
- }
- else if (d[to] < d[v])
- {
- if (col[to] == col[v])
- {
- s = v, t = to;
- edge_ind = ind;
- }
- }
- }
- }
- void solve_tree(int v)
- {
- u[v] = true;
- for (auto x : g[v])
- {
- int to = x.first, ind = x.second;
- if (ind != edge_ind && !u[to])
- {
- solve_tree(to);
- ans[ind] = c[to];
- c[v] -= c[to];
- }
- }
- }
- int main()
- {
- #ifdef ONPC
- freopen("a.in", "r", stdin);
- #endif
- int n, m;
- scanf("%d%d", &n, &m);
- for (int i = 0; i < n; i++)
- {
- scanf("%lld", &c[i]);
- cur[i] = c[i];
- }
- for (int i = 0; i < m; i++)
- {
- int a, b;
- scanf("%d%d", &a, &b);
- a--, b--;
- g[a].push_back({b, i});
- g[b].push_back({a, i});
- }
- dfs(0);
- if (cur[0] == 0)
- {
- puts("YES");
- for (int i = 0; i < m; i++)
- {
- printf("%lld\n", ans[i]);
- }
- return 0;
- }
- if (edge_ind != -1)
- {
- for (int i = 0; i < m; i++)
- {
- ans[i] = 0;
- }
- for (int i = 0; i < n; i++)
- {
- u[i] = 0;
- }
- solve_tree(s);
- ll get = c[s] / 2;
- int cur = s;
- int sign = 1;
- while (cur != t)
- {
- ans[par_ind[cur]] += sign * get;
- sign *= -1;
- cur = par[cur];
- }
- ans[edge_ind] += sign * get;
- puts("YES");
- for (int i = 0; i < m; i++)
- {
- printf("%lld\n", ans[i]);
- }
- }
- else
- {
- puts("NO");
- return 0;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement