����� � ������� � ��� ���������� (original) (raw)

���������: 10 Jun 2008 19:19
�������������: 10 Jun 2008 19:21

����� � �������

��� ���� �� �������� ���������� �� ������.

� ���������� ������ � ������� ��������� ����������������� ������ ���� � �����.

�������� �������� �� O (N+M).

���������� ���������

����������

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); }