MAXimal

���������: 10 Jun 2008 19:39
�������������: 2 Oct 2010 1:35

���������� [������]

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

����� ��� ���� � N ��������� � M �������, ��� ������� �� ������� ������ ��� ��� Li. ����� ���� ��������� ������� V0. ��������� ����� ���������� ���� �� ������� V0 �� ���� ��������� ������.

�������� ������ ������ ��� ������ ������ ���������� (�� ������ ����������� � �������� ������ ��. ����).

��������

����� ������ D[1..N] ����� ��������� ������� ���������� ����� �����, �.�. Di - ��� ������� ����� ����������� ���� �� ������� V0 �� ������� i. ���������� ������ D �������� ���������� "�������������", ����� DV0 = 0. �� ��������� ������ ��������� ���� ������ ����� ��������� ������������� ���������� ����������.

����� ������ P[1..N] �������� ������� �������, �.�. Pi - ��� �������, �������������� ������� i � ���������� ���� �� ������� V0 �� i. ��� �� ��� � ������ D, ������ P ���������� ���������� �� ���� ��������� � � ����� ��� ��������� ������������� ��������.

�

������ ���������� ��� �������� ������. �� ������ ���� �������������� ��� ��������� ������:

  • M0 - �������, ���������� �� ������� ��� ��������� (��, ��������, �� ������������);
  • M1 - �������, ���������� �� ������� �����������;
  • M2 - �������, ���������� �� ������� ��� �� ���������.

������� � ��������� M1 �������� � ���� ��������������� ������� (deque).

�

���������� ��� ������� ���������� � ��������� M2, ����� ������� V0, ������� ���������� � ��������� M1.

�� ������ ���� ��������� �� ���� ������� �� ��������� M1 (������ ������� ������� �� �������). ����� V - ��� ��������� �������. ��������� ��� ������� �� ��������� M0. ����� ������������� ��� ����, ��������� �� ���� �������. ����� T - ��� ������ ����� �������� ����� (�.�. �� ������ V), � L - ��� ����� �������� �����.

  • ���� T ����������� M2, �� T ��������� �� ��������� M1 � ����� �������. DT �������� ������ DV + L.
  • ���� T ����������� M1, �� �������� �������� �������� DT: DT = min (DT, DV + L). ���� ������� T ����� �� ������������� � �������.
  • ���� T ����������� M0, � ���� DT ����� �������� (DT > DV + L), �� �������� DT, � ������� T ���������� � ��������� M1, ������� � � ������ �������.

����������, ��� ������ ���������� ������� D ������� ��������� � �������� � ������� P.

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

�������� ������ ID[1..N], � ������� ��� ������ ������� ����� �������, ������ ��������� ��� �����������: 0 - ���� M2 (�.�. ���������� ����� �������������), 1 - ���� M1 (�.�. ������� ��������� � �������), � 2 - ���� M0 (��������� ���� ��� ��� ������, ���������� ������ �������������).

������� ��������� ����� ����������� ����������� ���������� ������ deque. ������ ���� ����� ����������� ������. ��-������, ��������, � ������� � ����� ������ ������� ����� ��������� �������� N ���������. ��, ��-������, �� ����� ��������� �������� � � ������, � � ����� �������. �������������, �� ����� ������������ ������� �� ������� ������� N, ������ ����� ��������� ���. �.�. ������ ������ Q[1..N], ��������� (int) �� ������ ������� QH � �� ������� ����� ���������� QT. ������� �����, ����� QH == QT. ���������� � ����� - ������ ������ � Q[QT] � ���������� QT �� 1; ���� QT ����� ����� ����� �� ������� ������� (QT == N), �� ������ QT = 0. ���������� � ������ ������� - ��������� QH �� 1, ���� ��� ����� �� ������� ������� (QH == -1), �� ������ QH = N-1.

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

�����������

��� �� �������� �����-����� ������� ��������������� ������ ����� ���������. � �������� ������ ������ O (N M) � �������� ���������.

������ �� �������� ��������� �������������� ���� ����� ������: ����� ��� ������ � �������� ��� O (M log N), ����, ���������, ��� ������������� ����������������� ������.

����������

typedef pair<int,int> rib;
typedef vector < vector<rib> > graph;

const int inf = 1000*1000*1000;


int main()
{
	int n, v1, v2;
	graph g (n);

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

	vector<int> d (n, inf);
	d[v1] = 0;
	vector<int> id (n);
	deque<int> q;
	q.push_back (v1);
	vector<int> p (n, -1);

	while (!q.empty())
	{
		int v = q.front(),  q.pop_front();
		id[v] = 1;
		for (size_t i=0; i<g[v].size(); ++i)
		{
			int to = g[v][i].first, len = g[v][i].second;
			if (d[to] > d[v] + len)
			{
				d[to] = d[v] + len;
				if (id[to] == 0)
					q.push_back (to);
				else if (id[to] == 1)
					q.push_front (to);
				p[to] = v;
				id[to] = 1;
			}
		}
	}

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

}

�

�

�

�