MCPcopy Create free account
hub / github.com/SuprDewd/CompetitiveProgramming / arborescence

Class arborescence

code/graph/arborescence.cpp:2–38  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1#include "../data-structures/union_find.cpp"
2struct arborescence {
3 int n; union_find uf;
4 vector<vector<pair<ii,int> > > adj;
5 arborescence(int _n) : n(_n), uf(n), adj(n) { }
6 void add_edge(int a, int b, int c) {
7 adj[b].push_back(make_pair(ii(a,b),c)); }
8 vii find_min(int r) {
9 vi vis(n,-1), mn(n,INF); vii par(n);
10 rep(i,0,n) {
11 if (uf.find(i) != i) continue;
12 int at = i;
13 while (at != r && vis[at] == -1) {
14 vis[at] = i;
15 iter(it,adj[at]) if (it->second < mn[at] &&
16 uf.find(it->first.first) != at)
17 mn[at] = it->second, par[at] = it->first;
18 if (par[at] == ii(0,0)) return vii();
19 at = uf.find(par[at].first); }
20 if (at == r || vis[at] != i) continue;
21 union_find tmp = uf; vi seq;
22 do { seq.push_back(at); at = uf.find(par[at].first);
23 } while (at != seq.front());
24 iter(it,seq) uf.unite(*it,seq[0]);
25 int c = uf.find(seq[0]);
26 vector<pair<ii,int> > nw;
27 iter(it,seq) iter(jt,adj[*it])
28 nw.push_back(make_pair(jt->first,
29 jt->second - mn[*it]));
30 adj[c] = nw;
31 vii rest = find_min(r);
32 if (size(rest) == 0) return rest;
33 ii use = rest[c];
34 rest[at = tmp.find(use.second)] = use;
35 iter(it,seq) if (*it != at)
36 rest[*it] = par[*it];
37 return rest; }
38 return par; } };
39// vim: cc=60 ts=2 sts=2 sw=2:

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected