Mamy nieskierowany graf o n wierzchołkach i m krawędziach. Każda krawędź ma wagę 1 lub 2. Każdemu wierzchołkowi v należy przypisać liczbę rzeczywistą w[v], tak by suma przypisanych liczb na każdej danej krawędzi była równa wadze krawędzi oraz suma wartości bezwzględnych w[v] była minimalna.
Na początek warto rozważyć uproszczenie, w którym waga każdej krawędzi wynosi 1.
Wtedy, jeśli jakiemuś wierzchołkowi przypiszemy
Możemy więc zacząć od dowolnego wierzchołka składowej, przypisać mu
Jeśli wierzchołkowi z przypisanym
Mamy więc dwa przypadki: albo składowa zawiera cykl nieparzystej długości
(i wtedy wszystkie wierzchołki mają
Zacznijmy znowu od pewnego wierzchołka, któremu przypiszemy
Możemy znowu robić DFS-a i w każdym wierzchołku trzymać parę
Ciekawie się robi, jeśli wierzchołkowi z parą
Jeśli
Jeśli
Po przejściu DFS-em mamy znów dwa przypadki:
dla grafu niedwudzielnego mamy
Wkład wierzchołków z jednego zbioru to będzie
const int N = 110000; int n,m; vector<pii> adj[N]; pii vis[N]; bool has; int fix; int ans[N]; vector<int> verts; void dfs(int v, int a, int b) { vis[v] = make_pair(a, b); verts.push_back(v); for (auto e : adj[v]) { int u = e.first, c = e.second; int na = -a; int nb = c - b; if (vis[u].first == 0) { dfs(u, na, nb); } else if (na == vis[u].first) { if (nb != vis[u].second) { printf("NO\n"); exit(0); } } else { int f = vis[u].second - nb; f *= na; if (has && fix != f) { printf("NO\n"); exit(0); } has = true; fix = f; } } } int main() { scanf("%d%d",&n,&m); REP(i,m) { int a,b,c; scanf("%d%d%d",&a,&b,&c); --a; --b; adj[a].emplace_back(b, c); adj[b].emplace_back(a, c); } REP(i,n) if (vis[i].first == 0) { verts.clear(); has = false; dfs(i, 1, 0); if (!has) { vector<int> z; for (int v : verts) { z.push_back(vis[v].first * vis[v].second); } nth_element(z.begin(), z.begin() + z.size()/2, z.end()); fix = -z[z.size()/2] * 2; } for (int v : verts) { ans[v] = vis[v].first * fix + 2 * vis[v].second; } } printf("YES\n"); REP(i,n) { printf("%.1lf ", ans[i] / 2.0); } printf("\n"); }
Program działa w czasie liniowym plus czas na znajdowanie mediany.