����� � ������� � ��� ���������� (original) (raw)
���������: 10 Jun 2008 19:19
�������������: 10 Jun 2008 19:21
����� � �������
��� ���� �� �������� ���������� �� ������.
� ���������� ������ � ������� ��������� ����������������� ������ ���� � �����.
�������� �������� �� O (N+M).
���������� ���������
- ����� ������ ���� � �����.
- ����� ����������������� ������� ���� � �����.
- ��������, �������� �� ���� ������� ������ ������� ������:
� ������ � ����� �������� ������ � ������� ����� ���������� "�����" ������ � ������ � ������ �������. ������ �� O(1) ����� ����� �����: ������� i �������� ������� ������� j ����� � ������ �����, ����� starti < startj � endi > endj. - ������ LCA (���������� ����� ������).
- �������������� ����������:
��������� ����� ������� � �������, ����� ������ ��� ������� �����. ����������� ������� �� ������� ������ �� �������� - ��� � ����� �������. - �������� ����� �� ������������ � ���������� �����
- ����� ��������� ������� ���������:
������� ������ �������������� ����������, ����� ������������� ���� � �������� ����� ����� ������� � ������� � �������, ������������ �������������� �����������. ������ ������ ������ - ������������� ����������. - ����� ������:
������� ���������� ���� � ���������������, ����� ����� ������� � �������, � ���������� ������ ����� ���, ��� �� �������� �� ���� ������. ����� ������� ������������� ����������. ������� �������� �� ����, ����� ������� ����������� ������ ������������� �����������.
����������
vector < vector > g; // ���� int n; // ����� ������
vector color; // ���� ������� (0, 1, ��� 2)
vector time_in, time_out; // "�������" ������ � ������ �� ������� int dfs_timer = 0; // "������" ��� ����������� �����
void dfs (int v) { time_in[v] = dfs_timer++; color[v] = 1; for (vector::iterator i=g[v].begin(); i!=g[v].end(); ++i) if (color[*i] == 0) dfs (*i); color[v] = 2; time_out[v] = dfs_timer++; }
��� �������� ����� ���. �� ������ ������� ������� ������ � ������ �� ������� �� �����, ��� �� ��� � �� ����� ����� ������ (�� ����� ���� ����� ������ ����������� �� ������ ��������� ������ used). ��� �������� ������� ����������:
vector < vector > g; // ���� int n; // ����� ������
vector used;
void dfs (int v) { used[v] = true; for (vector::iterator i=g[v].begin(); i!=g[v].end(); ++i) if (!used[*i]) dfs (*i); }