рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдЧреНрд░рд╛рдлрд╝ рдкрд░ рд╕рдмрд╕реЗ рдЖрдо рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ - рдЧрд╣рд░рд╛рдИ рдореЗрдВ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ - рдПрдХ рднреВрд▓рднреБрд▓реИрдпрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рд░рд╛рд╕реНрддрд╛ рдЦреЛрдЬрдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред рд╣рд░ рдХреЛрдИ рдЬреЛ рджрд┐рд▓рдЪрд╕реНрдкреА рд░рдЦрддрд╛ рд╣реИ - рдХрдЯреМрддреА рдореЗрдВ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ!
рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдмрдпрд╛рди
рдпрд╣ "рдХрдЪреНрдЪреЗ" рднреВрд▓рднреБрд▓реИрдпрд╛ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ (рдХрдо рд╕реЗ рдХрдо рдЧреНрд░рд╛рдлрд╝ рдХрд╛ рдкрд░рд┐рдЪрдп рдкреНрд░рд┐рдп рд╣реЛрдЧрд╛), рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ рд╡рд┐рднрд╛рдЬрди рд╕реЗ рдЬреБрдбрд╝реЗ "рдХрдорд░реЛрдВ" рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗрдВрдЧреЗред рд▓рдЧрднрдЧ рджрд╛рдИрдВ рдУрд░ рдХреА рдЖрдХреГрддрд┐ рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЕрдм рдХрд╛рд░реНрдп рдиреЗ рдпрд╣ рд░реВрдк рд▓реЗ рд▓рд┐рдпрд╛ рд╣реИ: рдХрдИ рдХрдорд░реЗ рд╣реИрдВ, рдЖрдк рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдХреЗ рдмреАрдЪ рдореЗрдВ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдХрдорд░рд╛ рдП рд╕реЗ рдХрдорд░реЗ рдмреА рддрдХ рдХрд╛ рд░рд╛рд╕реНрддрд╛ рдЦреЛрдЬрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
рдЧреНрд░рд╛рдл рд╕рд┐рджреНрдзрд╛рдВрдд рдореЗрдВ, "рдХрдорд░реЗ" рдХреЛ рдХреЛрдиреЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ; рдЙрдирдХреЗ рдмреАрдЪ рдХреЗ "рдмрджрд▓рд╛рд╡" рдХреЛ рдХрд┐рдирд╛рд░реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдХрдорд░рд╛ A рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╢рд┐рдЦрд░ рд╣реИ, рдХрдорд░рд╛ B рдЕрдВрдд рд╣реИред
рдЪрд┐рддреНрд░ рдореЗрдВ рджрд╛рдИрдВ рдУрд░ рдХрд╛ рдЧреНрд░рд╛рдл рдЧреНрд░рд╛рдл рд╕рд┐рджреНрдзрд╛рдВрдд рдореЗрдВ рдХреБрдЫ рд╣рдж рддрдХ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
рдпрд╣рд╛рдВ, рдЕрдВрдбрд╛рдХрд╛рд░ рдХреЛрдиреЗ (рдпрд╛ рдХрдорд░реЗ) рд╣реИрдВ, рд▓рд╛рдЗрдиреЗрдВ рдХрд┐рдирд╛рд░реЛрдВ (рдпрд╛ рдЙрдирдХреЗ рдмреАрдЪ рд╕рдВрдХреНрд░рдордг) рд╣реИрдВред рд╡рд░реНрдЯреЗрдХреНрд╕ 1 рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╣реИ, рд╡рд░реНрдЯреЗрдХреНрд╕ 12 рдЕрдВрддрд┐рдо рд╣реИред
рдФрд░ рд╣рдо рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХреИрд╕реЗ рд╣рд▓ рдХрд░реЗрдВрдЧреЗ?
рдкрд╣рд▓реА рдЪреАрдЬ рдЬреЛ рдореИрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рд╡рд╣ рд╣реИ рдПрдХ рд╕рдВрдкреВрд░реНрдг рдЦреЛрдЬ рд▓рд┐рдЦрдирд╛: рд╕рдордп рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдХреНрд╖рдг рдореЗрдВ рд╣рдо рдХреБрдЫ рдЪрд░рдо рдкрд░ рд╣реИрдВ, рдФрд░ рд╣рдо рдЗрд╕реЗ рд╕рднреА рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреЗ рдкрд╛рд╕ рдЬрд╛рддреЗ рд╣реИрдВ:
рдХреНрд░реВрд░ рдмрд▓рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЧреНрд░рд╛рдл рд╡реЗрдХреНрдЯрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ <рд╡реЗрдХреНрдЯрд░ <int> рдХрд┐рдирд╛рд░реЛрдВ рд╕рд░рдгреА, рдХрд┐рдирд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде [v] рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рдХреЛрдиреЗ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ v рд╕реЗ рдПрдХ рдХрд┐рдирд╛рд░реЗ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рднреА рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЕрдВрддрд┐рдо рдЪрд░ рд╕рдВрдЦреНрдпрд╛ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдЦрддреНрдо рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИред
void travel(int v) { if (v == finish)
рдХрд╛рд╢, рдпрд╣ рдХреЛрдб рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рддреАрди рд╕рд┐рд░реЛрдВ рдХреЗ рдЧреНрд░рд╛рдл рдкрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╢реАрд░реНрд╖ рдХрд┐рдирд╛рд░реЛрдВ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ - рдЬрдм рд╢реАрд░реНрд╖ 1 рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╣рдо рд╢реАрд░реНрд╖ 2 рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ, рдЗрд╕реЗ рд╢реАрд░реНрд╖ рд╕реЗ 1 рддрдХ, рдлрд┐рд░ рд╕реЗ рд╡рд░реНрдЯреЗрдХреНрд╕ 2, ... рдФрд░ рдХреБрдЫ рдмрд┐рдВрджреБ рдкрд░, рдПрдХ рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ рдХреЗ рдХрд╛рд░рдг рдкреНрд░реЛрдЧреНрд░рд╛рдо рдмрд╕ рджреБрд░реНрдШрдЯрдирд╛рдЧреНрд░рд╕реНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
рдХреНрдпрд╛ рдХрд░реЗрдВ?
рд╕рдорд╛рдзрд╛рди рдЬреЛ рддреБрд░рдВрдд рджрд┐рдорд╛рдЧ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рдЙрд╕рдХреЗ рдкреНрд░рд╡реЗрд╢ рджреНрд╡рд╛рд░ рдкрд░ рдкреНрд░рддреНрдпреЗрдХ рд╢реАрд░реНрд╖ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдирд╛ рд╣реИ, рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЪрд┐рд╣реНрдирд┐рдд рдХреЛрдиреЗ рдореЗрдВ рдХрднреА рдирд╣реАрдВ рдЬрд╛рдирд╛ рд╣реИ - рдпрд╣ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдЪрд▓рдирд╛ рд╣реИ:
рдбреАрдПрдлрдПрд╕ void DFS(int v) { if (mark[v] != 0)
рдФрд░ рддреЛ рдХреНрдпрд╛?
рд╣рд╛рдВ, рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд┐рд╕реА рддрд░рд╣ рдЪрд▓рд╛ рдЧрдпрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдХреИрд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП?
рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рд╢реАрд░реНрд╖ рдХреЗ рд▓рд┐рдП рдпрд╛рдж рдХрд░реЗрдВрдЧреЗ, рдЬрд╣рд╛рдВ рд╣рдо рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╕рд░рдгреА рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рдЖрдП рдереЗред
рдбреАрдПрдлрдПрд╕ void DFS(int v, int from) { if (mark[v] != 0)
рддрдм рдорд╛рд░реНрдЧ рдмрд╣рд╛рд▓ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рддреБрдЪреНрдЫ рд╣реЛрдЧрд╛:
get_path vector<int> get_path() { vector<int> ans; for (int v = finish; v != start; v = prior[v])
рдпрд╣ рдХрд╛рдо рдХреНрдпреЛрдВ рдХрд░рддрд╛ рд╣реИ?
рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╣рдореЗрд╢рд╛ рд╢реАрд░реНрд╖ рдкрд░ рдПрдХ рд░рд╛рд╕реНрддрд╛ рдЦреЛрдЬреЗрдЧрд╛, рдЕрдЧрд░ рдпрд╣ рдореМрдЬреВрдж рд╣реИред рд╕рдмреВрдд:
рдПрдХ рдордирдорд╛рдирд╛ рдЧреНрд░рд╛рдлрд╝ G рдХреЗ рд▓рд┐рдП:
рдмреЗрд╕ред рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо 1 рд╕реЗ рдЕрдзрд┐рдХ рд╡рд░реНрдЯреЗрдХреНрд╕ рд╕реЗ рд░рд╛рд╕реНрддреЛрдВ рдХреЛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдвреВрдВрдврддрд╛ рд╣реИ (рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╢реАрд░реНрд╖ рд╕реЗ рдЙрд╕рдХреЗ рд▓рд┐рдП рдкрде рд╕рдорд╛рди рд╣реИ)ред
рдЕрдиреБрдорд╛рди: рдПрд▓реНрдЧреЛрд░рд┐рдердо рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдПрдХ рд╕реЗ k - 1 рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рдХреА рджреВрд░реА рдкрд░ рд╕реНрдерд┐рдд рд╕рднреА рдЪреЛрдЯрд┐рдпреЛрдВ рдХрд╛ рджреМрд░рд╛ рдХрд░рддрд╛ рд╣реИред
рдЪрд░рдг: рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдПрдХ рд╕реЗ рджреВрд░реА k рдкрд░ рд╕реНрдерд┐рдд рдХрд┐рд╕реА рднреА рд╢реАрд░реНрд╖ v рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдпрд╣ рдПрдХ рдХрд┐рдирд╛рд░реЗ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ рдЬреЛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдПрдХ рд╕реЗ k - 1 рдХреА рджреВрд░реА рдкрд░ рд╕реНрдерд┐рдд рдХреБрдЫ рд╢реАрд░реНрд╖ рдкрд░ рд╣реИ - рдЪрд▓реЛ рдЗрд╕реЗ w рдХрд╣рддреЗ рд╣реИрдВред рддреЛ, рд╣рдо рд╢реАрд░реНрд╖ рдкрд░ рдЬрд╛рдПрдВрдЧреЗ рдЬрдм рд╡рд░реНрдЯреЗрдХреНрд╕ рдбрдмреНрд▓реНрдпреВ рджреЗрдЦрддреЗ рд╣реИрдВред
рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдХрд┐рддрдиреЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ?
рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдкреНрд░рддреНрдпреЗрдХ рдХрд┐рдирд╛рд░реЗ рдХреЛ рдПрдХ рдмрд╛рд░ рд╕реНрдХреИрди рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рд╢реАрд░реНрд╖ рдХреЗ рд▓рд┐рдП рдирд┐рд░рдВрддрд░ рдХреНрд░рд┐рдпрд╛ рдХрд░рддрд╛ рд╣реИред рд╡реА рдФрд░ рдХрд┐рдирд╛рд░реЛрдВ рдХреЛ рдИ рдХреЗ рд░реВрдк рдореЗрдВ рдХреЛрдиреЗ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдкрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рдордп рдУ (рд╡реА + рдИ) рд╣реИред
рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреА рдЧрд╣рд░рд╛рдИ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рд╕реНрдерд┐рдд рд╣реИрдВ, рдбреАрдПрдлрдПрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреА рдХреБрд▓ рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реИ - рдХреЛрдиреЗ рдХреА рд╕рдВрдЦреНрдпрд╛ред рдпрд╣реА рд╣реИ, рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдореЗрдореЛрд░реА рдХреА рдорд╛рддреНрд░рд╛ рд╣реЗ (рд╡реА) рд╣реИред
рдЧреИрд░-рдкреБрдирд░рд╛рд╡рд░реНрддреА рдбреАрдПрдлрдПрд╕
рдХрд┐рд╕реА рднреА рдкреБрдирд░рд╛рд╡рд░реНрддреА рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдЧреИрд░-рдкреБрдирд░рд╛рд╡рд░реНрддреА рд░реВрдк рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣рд╛рдБ DFS рдХреЗ рд▓рд┐рдП рдХреЛрдб рд╣реИ:
рдбреАрдПрдлрдПрд╕ void DFS() { stack<int> s; s.push(start); while (!s.empty()) { int v = s.top(); s.pop(); for (int i = 0; i < edges[v].size(); ++i) { if (mark[edges[v][i]] == 0) { s.push(edges[v][i]); mark[edges[v][i]] = 1; } } } }
рдЖрдЧреЗ рдХреНрдпрд╛ рд╣реИ?
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдЬрд╛рдирдХрд╛рд░реАрдкреВрд░реНрдг рдерд╛ред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓реЗрдЦреЛрдВ рдореЗрдВ рдореИрдВ рдбреАрдПрдлрдПрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреНрдпрд╛ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдмрддрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛, рдФрд░ рдпрд╣ рднреА рдХрд┐ рдмреАрдПрдлрдПрд╕, рдбреАрдЬрдХрд╕реНрдЯреНрд░рд╛ рдФрд░ рдЕрдиреНрдп рдЧреНрд░рд╛рдл рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИред