제출 #88716

#제출 시각아이디문제언어결과실행 시간메모리
88716popovicirobertPipes (BOI13_pipes)C++14
74.07 / 100
283 ms32488 KiB
#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 solve_tree(bool cycle) { int i; memset(father, 0, sizeof(father)); queue <int> Q; for(i = 1; i <= n; i++) { if(g[i].size() == 1) { Q.push(i); } } int root; while(Q.size()) { int nod = Q.front(); root = nod; Q.pop(); for(auto it : g[nod]) { if(father[it.first] != nod) { deg[it.first]++; father[nod] = it.first; sol[it.second] = c[nod]; c[it.first] -= c[nod]; c[nod] = 0; if(deg[it.first] + 1 == g[it.first].size()) { Q.push(it.first); } } } } if(cycle == 0) { for(i = 1; i <= n; i++) { if(c[i] != 0) { cout << 0; exit(0); } } } } 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; }

컴파일 시 표준 에러 (stderr) 메시지

pipes.cpp: In function 'void solve_tree(bool)':
pipes.cpp:80:38: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
                 if(deg[it.first] + 1 == g[it.first].size()) {
                    ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~
pipes.cpp:68:9: warning: variable 'root' set but not used [-Wunused-but-set-variable]
     int root;
         ^~~~
pipes.cpp: In function 'void solve_cycle(bool)':
pipes.cpp:124:9: warning: 'nod' may be used uninitialized in this function [-Wmaybe-uninitialized]
     dfs1(nod, nodes, 0, nod);
     ~~~~^~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...