MAXimal
home
algo
bookz
forum
about
�������� ������ MST (inverse-MST - �������� ������ ������������ ������)
Page source on the
HTML
language:
<h1>�������� ������ MST (inverse-MST - �������� ������ ������������ ������) �� O (N M<sup>2</sup>)</h1> <p>��� ���������� ����������������� ���� G � N ��������� � M ������ (��� ������ � ������� ����). ��������, ��� ���� �������. ����� ������ ��������� ����� T ����� ����� (�.�. ������� N-1 �����, ������� �������� ������ � N ���������). ��������� �������� ���� ���� ����� �������, ����� ��������� ����� T ������� ����������� ������� ����� ����� (������ ������, ����� �� ����������� �������), ������ ������� ��� ���, ����� ��������� ��������� ���� ����� ���� ����������.</p> <h2>�������</h2> <p><b>�����</b> ������ inverse-MST � ������ min-cost-flow, ������, <b>� ������, ������������ min-cost-flow</b> (� ������ �������������� ����� ��������� ����������������); ����� ����� ��������� ������.</p> <p>����, ����� ��� ���� G � N ���������, M ������. ��� ������� ����� ��������� ����� C<sub>i</sub>. �����������, �� ����� ��������, ��� ���� � �������� � 1 �� N-1 �������� ������ T.</p> <h3>1. ����������� � ����������� ������� MST</h3> <p>����� ��� ��������� ����� S (�� ����������� �����������).</p> <p>����� ������� ���� �����������. ���������� ��������� ����� j, �� ������������� S. ��������, � ����� S ������� ������������ ����, ����������� ����� ����� �����, �.�. ������������ ����, ����������� ����� ����� j � ��������� ������ �� ����, ������������� S. <b>��������� ����� P[j]</b> ��������� ����, ���������� ���� ���� ��� j-�� �����.</p> <p>��� ����, ����� ��������� ����� S ������� �����������, <b>���������� � ����������</b>, �����:</p> <formula>C<sub>i</sub> <= C<sub>j</sub> ��� ���� j ∉ S � ������� i ∈ P[j]</formula> <p>����� ��������, ���, ��������� <b>� ����� ������</b> ������ T ����������� ���� 1..N-1, �� �� ����� �������� ��� ������� ����� �������:</p> <formula>C<sub>i</sub> <= C<sub>j</sub> ��� ���� j = N..M � ������� i ∈ P[j] (������ ��� i ����� � ��������� 1..N-1)</formula> <h3>2. ���� �����</h3> <p>������� ����� ����� ��������������� ������� � ���������� ��������.</p> <p>����� ��� ��������� ����� S (�� ����������� �����������).</p> <p>����� <b>������ ����� H</b> ��� ����� G ����� ��������� ����:</p> <ul> <li>�� �������� M ������, ������ ������� � H ������� ���������� ������������� ���������� ����� � G.</li> <li>���� H ����������. � ������ ��� ���� ��������� ������� i, ������� ������������� ����� � G, ������������� ������ S. ��������������, �� ������ ���� ��������� ������� j, ������� ������������� �����, �� ������������� S.</li> <li>����� ���������� �� ������� i � ������� j ����� � ������ �����, ����� i ����������� P[j].<br>����� �������, ��� ������ ������� j �� ������ ���� � �� ������ ���� �� ���� ������ ������ ����, ��������������� ��������� ���� P[j].</li> </ul> <p>� ������ <b>����� ������</b> �� ����� ������� ��������� �������� ����� �����:</p> <formula>����� (i,j) ���������� � H, ���� i ∈ P[j], j = N..M, i = 1..N-1</formula> <h3>3. �������������� ������������ ������</h3> <p>����� ��������� <b>������ inverse-MST</b> ������������ ����� �������:</p> <formula>����� ������ A[1..M] �����, ��� C<sub>i</sub> + A<sub>i</sub> <= C<sub>j</sub> + A<sub>j</sub> ��� ���� j = N..M � ������� i ∈ P[j] (i � 1..N-1), � �������������� ����� |A<sub>1</sub>| + |A<sub>2</sub>| + ... + |A<sub>m</sub>|</formula> <p>����� ��� ������� �������� A �� ������������� �� ��������, ������� ����� �������� � ����� ���� (�.�., ����� ������ inverse-MST, �� �������� ��� C<sub>i</sub> ������� ����� i �� �������� C<sub>i</sub> + A<sub>i</sub>).</p> <p>��������, ��� ��� ������ ����������� ��� ����, ������������� T, �.�.</p> <pre>A<sub>i</sub> <= 0, i = 1..N-1</pre> <p>� ��� ������ ����������� ����, �� ������������� T:</p> <formula>A<sub>i</sub> >= 0, i = N..M</formula> <p>(��������� � ��������� ������ �� ������ ������� �����)</p> <p>����� �� ����� ������� <b>���������</b> ���������� ������, ����� �� ����� ������:</p> <formula>����� ������ A[1..M] �����, ��� C<sub>i</sub> + A<sub>i</sub> <= C<sub>j</sub> + A<sub>j</sub> ��� ���� j = N..M � ������� i ∈ P[j] (i � 1..N-1), A<sub>i</sub> <= 0, i = 1..N-1, A<sub>i</sub> >= 0, i = N..M, � �������������� ����� A<sub>n</sub> + ... + A<sub>m</sub> - (A<sub>1</sub> + ... + A<sub>n-1</sub>)</formula> <p>�������, ������ ������� "�����������" �� "������������", � � ����� ����� ������� ��� ����� �� ���������������:</p> <formula>����� ������ A[1..M] �����, ��� C<sub>i</sub> + A<sub>i</sub> <= C<sub>j</sub> + A<sub>j</sub> ��� ���� j = N..M � ������� i ∈ P[j] (i � 1..N-1), A<sub>i</sub> <= 0, i = 1..N-1, A<sub>i</sub> >= 0, i = N..M, � ��������������� ����� A<sub>1</sub> + ... + A<sub>n-1</sub> - (A<sub>n</sub> + ... + A<sub>m</sub>)</formula> <h3>4. �������� ������ inverse-MST � ������, ������������ ������ � �����������</h3> <p>������������ ������ inverse-MST, ������� �� ������ ��� ����, �������� ������������� ������ <b>��������� ����������������</b> � ������������ A<sub>1</sub>..A<sub>m</sub>.</p> <p>�������� ������������ ���� - ���������� <b>������������</b> �� ������.</p> <p>�� �����������, ����� �������� ������������ ������, ����� ������� ����������� ����������� ������������ ���������� X<sub>ij</sub>, �������� ������ ������� ������� (������� ����� ���� ��������������) � ������������ � ������ ������ ����������, �������� ����� "<=" �� ">=" � ��������, �������� ������������ �� �����������.</p> <p>����, <b>������������ � inverse-MST</b> ������:</p> <formula>����� ��� X<sub>ij</sub> ��� ������� (i,j) ∈ H, ����� ���: ��� X<sub>ij</sub> >= 0, ��� ������� i=1..N-1 ∑ X<sub>ij</sub> �� ���� j: (i,j) ∈ H <= 1, ��� ������� j=N..M ∑ X<sub>ij</sub> �� ���� i: (i,j) ∈ H <= 1, � �������������� ∑ X<sub>ij</sub> (C<sub>j</sub> - C<sub>i</sub>) ��� ���� (i,j) ∈ H</formula> <p>��������� ������ �������� <b>������� � �����������</b>: ��� ����� � ����� ����� H ������� ��������� ���� ���, ����� �� ���� ����� �� ������������ � ������ � �������, � ����� ����� ���� (��� ����� (i,j) ��������� ��� C<sub>j</sub> - C<sub>i</sub>) ������ ���� ����������.</p> <p>����� �������, <b>������������ ������ inverse-MST ������������ ������ � �����������</b>. ���� �� �������� ������ ������������ ������ � �����������, �� �� ������������� ����� ������ inverse-MST.</p> <h3>5. ������� ������������ ������ � �����������</h3> <p>������� ������ ������� �������� ���� �������� ������ ������ � �����������, ������� �� ��������. ��-������, ��� ������������������ ������ � �����������, ��������� � ����� ���� ��������� N-1 ������, � � ������ - M ������, �.�. � ����� ������ ����� ������ �� ������ ���� ������ �� ����� �������. ��� ������� ����� ������������ ������ � ����������� ���� ������������������ ��������, ������� ����� � �� O (N<sup>3</sup>), �� ����� ���� �������� ��������������� �� �����. ��-������, ����� ������ � ����������� ����� ������� ������� � ����������� � ����������� ���������: ���� ���� ������� ������� 0, ��� ������ ������� �� ������ ���� ������� ������ -C<sub>i</sub>, �� ������ ���� - ������ C<sub>j</sub>, � ������� ���������� ������ ����� ��� �� �����.</p> <p>�� ����� ������ ������ ������������ ������ � ����������� � ������� <b>����������������� ��������� min-cost-flow</b>, ������� ����� �������� ����� ����������� ��������� � ������������ ������� ������������ ������.</p> <p><b>������</b> ������ � ����������� � ������ min-cost-flow ����� �����, �� ��� ������� ������� �� ������ ���� �������.</p> <p>������� � ���� ����� s � ���� t. �� s � ������ ������� ������ ���� ������� ����� � ���������� ������������ = 1 � ���������� = 0. �� ������ ������� ������ ���� ������� ����� � t � ���������� ������������ = 1 � ���������� = 0. ���������� ����������� ���� ���� ����� ������ � ������ ������ ����� ������� ������� 1.</p> <p>�������, ����� ���������������� �������� min-cost-flow (��������� ����) �������, ����� <b>�������� ����� �� s � t</b> � ���������� ������������ = N+1 � ���������� = 0.</p> <h3>6. ���������������� �������� min-cost-flow ��� ������� ������ � �����������</h3> <p>����� �� ���������� <b>�������� ���������������� ���������� ����� � ������������</b>, ������� ���������� ������� �������� min-cost-flow, �� ���������� ����� ������� <b>�����������</b>, ������� � ����� ������ ��������� ����� ��������� <b>������� ������������ ������</b>.</p> <p>����� �����������. ��� ������� ����� (i,j) ��������� ����� U<sub>ij</sub> ��� ���������� �����������, ����� C<sub>ij</sub> - ��� ���������, ����� F<sub>ij</sub> - ����� ����� ����� �����.</p> <p>����� ����� ������� �����������. ������ ������� �������� ����� ����������� PI<sub>i</sub>. ���������� ��������� ����� CPI<sub>ij</sub> ������������ ���:</p> <formula>CPI<sub>ij</sub> = C<sub>ij</sub> - PI<sub>i</sub> + PI<sub>j</sub></formula> <p>� ����� ������ ������ ��������� <b>���������� ������</b>, ��� ����������� �������:</p> <formula>���� F<sub>ij</sub> = 0, �� CPI<sub>ij</sub> >= 0 ���� F<sub>ij</sub> = U<sub>ij</sub>, �� CPI<sub>ij</sub> <= 0 ����� CPI<sub>ij</sub> = 0</formula> <p>�������� �������� � �������� ������, � ��� ����� ����� ��������� ��������� �������� �����������, ������� �� ������������� ��������� ��������. �������� ���������, ��� ����� ������ �������� ����� �� ��������� �������:</p> <formula>PI<sub>j</sub> = 0 ��� j = N..M PI<sub>i</sub> = min C<sub>ij</sub>, ��� (i,j) ∈ H PI<sub>s</sub> = min PI<sub>i</sub>, ��� i = 1..N-1 PI<sub>t</sub> = 0</formula> <p>���������� ��� �������� min-cost-flow ������� �� ���������� ��������. <b>�� ������ ��������</b> �� ������� ���������� ���� �� s � t � ���������� ����, ������ � �������� ����� ���� ���������� ���������� ��������� CPI. ����� �� ����������� ����� ����� ���������� ���� �� �������, � ��������� ���������� ��������� �������:</p> <formula>PI<sub>i</sub> -= D<sub>i</sub></formula> <p>��� D<sub>i</sub> - ��������� ���������� ���������� �� s �� i (����������, � ���������� ���� � ������ ���� CPI).</p> <p>���� ��� ������ �� ����� ��� ���� �� s � t, ������� ������� �� ������������� ����� (s,t). ����� ����� ���� �������� ��� ������� <b>���������</b> ������ ���������: �������������, ���� �� �� ��������� ��������, �� ������ ��� ����� ���������� ���� � ��������������� ����������, � ��������� �� � ����� �� ����.</p> <p>� ����� ������ ��������� �� ������� ������� ������ � ����������� (� ���� ������ F<sub>ij</sub>) � ������� ������������ ������ � ����������� (� ������� PI<sub>i</sub>).</p> <p>(� PI<sub>i</sub> ���� ����� �������� ��������� �����������: �� ���� �������� PI<sub>i</sub> ������ PI<sub>s</sub>, ��������� ��� �������� ����� ����� ������ ��� PI<sub>s</sub> = 0)</p> <h3>6. ����</h3> <p>����, �� ������ ������������ ������ � �����������, �, �������������, � ������ inverse-MST.</p> <p>������ <b>�����������</b> ������������� ���������.</p> <p>������� �� ������ ����� ��������� ���� �����. ��� ����� ������ ��� ������� ����� j ∉ T ������� � ������ �� ������ T ����� ���� P[j]. ����� ���� ����� �� �������� �� O (M) * O (N) = O (N M).</p> <p>����� �� ����� ��������� �������� ����������� �� O (N) * O (M) = O (N M).</p> <p>����� �� ����� ��������� �������� min-cost-flow, ����� �������� ����� �� ����� N (��������� �� ������ ������� N ����, ������ � ���������� ������������ = 1), �� ������ �������� �� ���� � ����� ����� ���������� ���� �� ������ �� ���� ��������� ������. ��������� ������ � ����� ����� ����� M+2, � ����� ���� - O (N M), ��, ���� ����������� ����� ���������� ����� ���������� ��������� ��������� ��������, ������ �������� min-cost-flow ����� ��������� �� O (M<sup>2</sup>), � ���� �������� min-cost-flow ���������� �� O (N M<sup>2</sup>).</p> <p>�������� ����������� ��������� ����� <b>O (N M<sup>2</sup>)</b>.</p> <h2>����������</h2> <p>��������� ���� ������������� ��������. ������������ ��������� - ������ <algohref=dijkstra>��������� ��������</algohref> ����������� <algohref=levit_algorithm>�������� ������</algohref>, ������� �� ������ ������ ������ �������� ��������� �������.</p> <code>const int INF = 1000*1000*1000; struct rib { int v, c, id; }; struct rib2 { int a, b, c; }; int main() { int n, m; cin >> n >> m; vector < vector<rib> > g (n); // ���� � ������� ������� ��������� vector<rib2> ribs (m); // ��� ���� � ����� ������ ... ������ ����� ... int nn = m+2, s = nn-2, t = nn-1; vector < vector<int> > f (nn, vector<int> (nn)); vector < vector<int> > u (nn, vector<int> (nn)); vector < vector<int> > c (nn, vector<int> (nn)); for (int i=n-1; i<m; ++i) { vector<int> q (n); int h=0, t=0; rib2 & cur = ribs[i]; q[t++] = cur.a; vector<int> rib_id (n, -1); rib_id[cur.a] = -2; while (h < t) { int v = q[h++]; for (size_t j=0; j<g[v].size(); ++j) if (g[v][j].id >= n-1) break; else if (rib_id [ g[v][j].v ] == -1) { rib_id [ g[v][j].v ] = g[v][j].id; q[t++] = g[v][j].v; } } for (int v=cur.b, pv; v!=cur.a; v=pv) { int r = rib_id[v]; pv = v != ribs[r].a ? ribs[r].a : ribs[r].b; u[r][i] = n; c[r][i] = ribs[i].c - ribs[r].c; c[i][r] = -c[r][i]; } } u[s][t] = n+1; for (int i=0; i<n-1; ++i) u[s][i] = 1; for (int i=n-1; i<m; ++i) u[i][t] = 1; vector<int> pi (nn); pi[s] = INF; for (int i=0; i<n-1; ++i) { pi[i] = INF; for (int j=n-1; j<m; ++j) if (u[i][j]) pi[i] = min (pi[i], ribs[j].c-ribs[i].c); pi[s] = min (pi[s], pi[i]); } for (;;) { vector<int> id (nn); deque<int> q; q.push_back (s); vector<int> d (nn, INF); d[s] = 0; vector<int> p (nn, -1); while (!q.empty()) { int v = q.front(); q.pop_front(); id[v] = 2; for (int i=0; i<nn; ++i) if (f[v][i] < u[v][i]) { int new_d = d[v] + c[v][i] - pi[v] + pi[i]; if (new_d < d[i]) { d[i] = new_d; if (id[i] == 0) q.push_back (i); else if (id[i] == 2) q.push_front (i); id[i] = 1; p[i] = v; } } } for (int i=0; i<nn; ++i) pi[i] -= d[i]; for (int v=t; v!=s; v=p[v]) { int pv = p[v]; ++f[pv][v], --f[v][pv]; } if (p[t] == s) break; } for (int i=0; i<m; ++i) pi[i] -= pi[s]; for (int i=0; i<n-1; ++i) if (f[s][i]) ribs[i].c += pi[i]; for (int i=n-1; i<m; ++i) if (f[i][t]) ribs[i].c += pi[i]; ... ����� ����� ... }</code>