рдЧрдд рдЧрд░реНрдореАрдорд╛ рдореИрд▓реЗ рднрд╛рдЧ рд▓рд┐рдПрдБ
Google рд╕рдорд░ рдЕрдл рдХреЛрдб 2019 рдорд╛ рдПрдХ рд╕рд╣рднрд╛рдЧреАрдХреЛ рд░реВрдкрдорд╛, рдореИрд▓реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рднрд┐рддреНрд░ рдПрдЙрдЯрд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЧрд░реЗрдВ
рдпрд╕ рдкреЛрд╖реНрдЯрдорд╛ рдо рд╣рд╕реНрдХреЗрд▓рдорд╛ рджреНрд╡рд┐рдкрдХреНрд╖реАрдпрддрд╛рдХреЛ рд▓рд╛рдЧрд┐ рдЧреНрд░рд╛рдл рдЬрд╛рдБрдЪ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рдПрд▓реНрдЧреЛрд░рд┐рджрдордХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдХреЛ рдмрд╛рд░реЗрдорд╛ рдХреБрд░рд╛ рдЧрд░реНрдиреЗрдЫреБред рдпрджреНрдпрдкрд┐ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╕рдмреИрднрдиреНрджрд╛ рдЖрдзрд╛рд░рднреВрдд рдордзреНрдпреЗ рдПрдХ рд╣реЛ, рдпрд╕рд▓рд╛рдИ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╢реИрд▓реАрдорд╛ рд╕реБрдиреНрджрд░ рдврдВрдЧрд▓реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрдирд▓реЗ рдорд▓рд╛рдИ рдзреЗрд░реИ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рд╣рд░реВ рд▓рд┐рдпреЛ рд░ рдзреЗрд░реИ рдХрд╛рдордХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдерд┐рдпреЛред рдирддрд┐рдЬрд╛рдХреЛ рд░реВрдкрдорд╛, рдо рдореЛрдирд╛рдб рдЯреНрд░рд╛рдиреНрд╕рдлрд░реНрдорд░рдХреЛ рд╕рд╛рде рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдорд╛ рдмрд╕реЗред
рдореЗрд░реЛ рдмрд╛рд░реЗрдорд╛
рдореЗрд░реЛ рдирд╛рдо Vasily Alferov рд╣реЛ, рдо рд╕реЗрдиреНрдЯ рдкреАрдЯрд░реНрд╕рдмрд░реНрдЧ HSE рдорд╛ рдЪреМрдереЛ рд╡рд░реНрд╖рдХреЛ рд╡рд┐рджреНрдпрд╛рд░реНрдереА рд╣реБрдБред рдкрд╣рд┐рд▓реЗ рдмреНрд▓рдЧрдорд╛ рд▓реЗрдЦреЗрдХреЛ рдерд┐рдПрдБ
рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрд╛рд░реЗ
Foreword
рдХрд╛рд░реНрдпрдХреНрд░рдордорд╛ рд╕рд╣рднрд╛рдЧреА рд╡рд┐рджреНрдпрд╛рд░реНрдереАрд╣рд░реВрд▓рд╛рдИ рдмреНрд▓рдЧ рдЧрд░реНрди рджреГрдврддрд╛рдкреВрд░реНрд╡рдХ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдЧрд░рд┐рдиреНрдЫред рддрд┐рдиреАрд╣рд░реВрд▓реЗ рдорд▓рд╛рдИ рдмреНрд▓рдЧрдХреЛ рд▓рд╛рдЧрд┐ рдкреНрд▓реЗрдЯрдлрд░реНрдо рдкреНрд░рджрд╛рди рдЧрд░реЗ
рдкреНрд░рд╢реНрдирдорд╛ рдХреЛрдбрдХреЛ рд╕рд╛рде рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдлреЗрд▓рд╛ рдкрд╛рд░реНрди рд╕рдХрд┐рдиреНрдЫ
рддрдкрд╛рдИрд▓реЗ рдореЗрд░реЛ рдХрд╛рдордХреЛ рдирддрд┐рдЬрд╛рд╣рд░реВ рдкрдвреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ (рдЕрдВрдЧреНрд░реЗрдЬреАрдорд╛)
рдпреЛ рдкреЛрд╖реНрдЯрд▓реЗ рдкрд╛рдардХрд▓рд╛рдИ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдЩрдорд╛ рдЖрдзрд╛рд░рднреВрдд рдЕрд╡рдзрд╛рд░рдгрд╛рд╣рд░реВрд╕рдБрдЧ рдкрд░рд┐рдЪрд┐рдд рдЫ рднрдиреА рдорд╛рдиреНрджрдЫ, рдпрджреНрдпрдкрд┐ рдо рд╕рдордп рдЖрдЙрдБрджрд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдПрдХрд╛ рд╕рдмреИ рд╕рд░реНрддрд╣рд░реВ рд╕рдореНрдЭрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрдиреЗрдЫреБред
рджреНрд╡рд┐рдкрдХреНрд╖реАрдпрддрд╛рдХрд╛ рд▓рд╛рдЧрд┐ рдЧреНрд░рд╛рдлрд╣рд░реВ рдЬрд╛рдБрдЪ рдЧрд░реНрджреИ
рджреНрд╡рд┐рдкрдХреНрд╖реАрдпрддрд╛рдХреЛ рд▓рд╛рдЧрд┐ рдЧреНрд░рд╛рдл рдЬрд╛рдБрдЪ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛ рд╕рд░рд▓ рдЧреНрд░рд╛рдл рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдордзреНрдпреЗ рдПрдХрдХреЛ рд░реВрдкрдорд╛ рдПрд▓реНрдЧреЛрд░рд┐рджрдордХреЛ рдкрд╛рдареНрдпрдХреНрд░рдордорд╛ рджрд┐рдЗрдиреНрдЫред рдЙрдирдХреЛ рд╡рд┐рдЪрд╛рд░ рд╕реАрдзрд╛ рдЫ: рдкрд╣рд┐рд▓реЗ рд╣рд╛рдореА рдХреБрдиреИ рди рдХреБрдиреИ рд░реВрдкрдорд╛ рдмрд╛рдпрд╛рдБ рд╡рд╛ рджрд╛рдпрд╛рдБ рд╕рд╛рдЭреЗрджрд╛рд░реАрдорд╛ рдард╛рдбреЛ рд░рд╛рдЦреНрдЫреМрдВ, рд░ рдЬрдм рдПрдХ рд╡рд┐рд╡рд╛рджрд╛рд╕реНрдкрдж рдХрд┐рдирд╛рд░рд╛ рдлреЗрд▓рд╛ рдкрд░реНрдпреЛ, рд╣рд╛рдореА рдЧреНрд░рд╛рдл рджреНрд╡рд┐рдкрдХреНрд╖реАрдп рдЫреИрди рднрдиреЗрд░ рджрд╛рдмреА рдЧрд░реНрдЫреМрдВред
рдереЛрд░реИ рдердк рд╡рд┐рд╡рд░рдг: рдкрд╣рд┐рд▓реЗ рд╣рд╛рдореАрд▓реЗ рдмрд╛рдпрд╛рдБ рд╕реЗрдпрд░рдорд╛ рдХреЗрд╣реА vertex рд░рд╛рдЦреНрдЫреМрдВред рдЬрд╛рд╣рд┐рд░ рдЫ, рдпрд╕ рд╢реАрд░реНрд╖ рдХреЛ рд╕рдмреИ рдЫрд┐рдореЗрдХреАрд╣рд░реВ рд╕рд╣реА рд▓реЛрдмрдорд╛ рд╕реБрддреНрдиреБ рдкрд░реНрдЫред рдпрд╕рдмрд╛рд╣реЗрдХ, рдпрд╕ рд╢реАрд░реНрд╖рдХреЛ рдЫрд┐рдореЗрдХреАрд╣рд░реВрдХрд╛ рд╕рдмреИ рдЫрд┐рдореЗрдХреАрд╣рд░реВ рдмрд╛рдпрд╛рдБ рд▓реЛрдмрдорд╛ рд╕реБрддреНрдиреБ рдкрд░реНрдЫ, рд░ рдпрд╕реНрддреИред рд╣рд╛рдореАрд▓реЗ рдЫрд┐рдореЗрдХреАрд╣рд░реВрд▓рд╛рдИ рддреЛрдХреЗрдХрд╛ рдЫреИрдиреМрдВ рднрд░реНрдЯреЗрдХреНрд╕рдХреЛ рдЬрдбрд╛рди рдЧрд░рд┐рдПрдХреЛ рдХрдореНрдкреЛрдиреЗрдиреНрдЯрдорд╛ рднреЗрд░реНрдЯрд┐рд╕рд╣рд░реВ рдЕрдЭреИ рдмрд╛рдБрдХреА рд░рд╣реЗрд╕рдореНрдо рд╣рд╛рдореА рдареЗрдЧрд╛рдирд╛рд╣рд░реВрд▓рд╛рдИ рд╕реЗрдпрд░рд╣рд░реВ рддреЛрдХреНрди рдЬрд╛рд░реА рд░рд╛рдЦреНрдЫреМрдВред рддреНрдпрд╕рдкрдЫрд┐ рд╣рд╛рдореА рдпреЛ рдХрд╛рд░реНрдп рд╕рдмреИ рдЬрдбрд╛рди рднрдПрдХрд╛ рдШрдЯрдХрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рджреЛрд╣реЛрд░реНрдпрд╛рдЙрдБрдЫреМрдВред
рдпрджрд┐ рдЙрд╣реА рд╡рд┐рднрд╛рдЬрдирдорд╛ рдкрд░реЗрдХрд╛ рдард╛рдбреЛрд╣рд░реВ рдмреАрдЪрдХреЛ рдХрд┐рдирд╛рд░рд╛ рдЫ рднрдиреЗ, рдЧреНрд░рд╛рдлрдорд╛ рдПрдХ рдЕрдЬреАрдм рдЪрдХреНрд░ рдлреЗрд▓рд╛ рдкрд╛рд░реНрди рдЧрд╛рд╣реНрд░реЛ рдЫреИрди, рдЬреБрди рджреНрд╡рд┐рдкрдХреНрд╖реАрдп рдЧреНрд░рд╛рдлрдорд╛ рд╡реНрдпрд╛рдкрдХ рд░реВрдкрдорд╛ рдЬреНрдЮрд╛рдд (рд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдкрдорд╛) рдЕрд╕рдореНрднрд╡ рдЫред рдЕрдиреНрдпрдерд╛, рд╣рд╛рдореАрд╕рдБрдЧ рд╕рд╣реА рд╡рд┐рднрд╛рдЬрди рдЫ, рдЬрд╕рдХреЛ рдЕрд░реНрде рдЧреНрд░рд╛рдл рджреНрд╡рд┐рдкрдХреНрд╖реАрдп рдЫред
рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛, рдпреЛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдкреНрд░рдпреЛрдЧ рдЧрд░реА рд▓рд╛рдЧреВ рдЧрд░рд┐рдПрдХреЛ рдЫ
рдпрд╕рд░реА, рд╣рд╛рдореА рдирд┐рдореНрди рдпреЛрдЬрдирд╛рдорд╛ тАЛтАЛрдЖрдПрдХрд╛ рдЫреМрдВред рд╣рд╛рдореА рдЧрд╣рд┐рд░рд╛рдИ-рдкрд╣рд┐рд▓реЛ рдЦреЛрдЬ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдЧреНрд░рд╛рдлрдХреЛ рдард╛рдбреЛ рдкрд╛рд░ рдЧрд░реНрдЫреМрдВ рд░ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рд╕реЗрдпрд░рд╣рд░реВ рдЕрд╕рд╛рдЗрди рдЧрд░реНрдЫреМрдВ, рд╣рд╛рдореА рдХрд┐рдирд╛рд░рд╛рд╕рдБрдЧреИ рдЕрдШрд┐ рдмрдвреНрджрд╛ рд╕реЗрдпрд░рдХреЛ рд╕рдВрдЦреНрдпрд╛ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрдЫреМрдВред рдпрджрд┐ рд╣рд╛рдореАрд▓реЗ рдкрд╣рд┐рд▓реЗ рдиреИ рд╕реЗрдпрд░ рддреЛрдХрд┐рдПрдХреЛ рднрд░реНрдЯреЗрдХреНрд╕рдорд╛ рд╕реЗрдпрд░ рдЕрд╕рд╛рдЗрди рдЧрд░реНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрдЫреМрдВ рднрдиреЗ, рд╣рд╛рдореА рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдкрдорд╛ рднрдиреНрди рд╕рдХреНрдЫреМрдВ рдХрд┐ рдЧреНрд░рд╛рдл рджреНрд╡рд┐рдкрдХреНрд╖реАрдп рдЫреИрдиред рд╕рдмреИ рдард╛рдбреЛрд╣рд░реВрд▓рд╛рдИ рд╕рд╛рдЭрд╛ рддреЛрдХрд┐рдПрдХреЛ рдХреНрд╖рдг рд░ рд╣рд╛рдореАрд▓реЗ рд╕рдмреИ рдХрд┐рдирд╛рд░рд╣рд░реВ рд╣реЗрд░реЗрдХрд╛ рдЫреМрдВ, рд╣рд╛рдореАрд╕рдБрдЧ рд░рд╛рдореНрд░реЛ рд╡рд┐рднрд╛рдЬрди рдЫред
рдЧрдгрдирд╛ рдХреЛ рд╢реБрджреНрдзрддрд╛
рд╣рд╛рд╕реНрдХреЗрд▓рдорд╛ рд╣рд╛рдореА рдорд╛рдиреНрджрдЫреМрдВ рдХрд┐ рд╕рдмреИ рдЧрдгрдирд╛рд╣рд░реВ рдЫрдиреН рд╕рдлрд╛ред рдпрджреНрдпрдкрд┐, рдпрджрд┐ рдпреЛ рд╕рд╛рдБрдЪреНрдЪреИ рдорд╛рдорд▓рд╛ рд╣реЛ рднрдиреЗ, рд╣рд╛рдореАрд╕рдБрдЧ рд╕реНрдХреНрд░рд┐рдирдорд╛ рдХреЗрд╣рд┐ рдЫрд╛рдкреНрдиреЗ рдХреБрдиреИ рддрд░рд┐рдХрд╛ рд╣реБрдиреЗрдЫреИрдиред рдмрд┐рд▓реНрдХреБрд▓реИ, рд╕рдлрд╛ рдЧрдгрдирд╛ рдпрддрд┐ рдЕрд▓реНрдЫреА рдЫ рдХрд┐ рддреНрдпрд╣рд╛рдБ рдПрдХ рдЫреИрди рд╕рдлрд╛ рдХреЗрд╣рд┐ рдЧрдгрдирд╛ рдЧрд░реНрди рдХрд╛рд░рдгрд╣рд░реВред рдХрд╛рд░реНрдпрдХреНрд░рдордорд╛ рд╣реБрдиреЗ рд╕рдмреИ рдЧрдгрдирд╛рд╣рд░реВ рдХреБрдиреИ рди рдХреБрдиреИ рд░реВрдкрдорд╛ рдмрд╛рдзреНрдп рдЫрдиреН "рдЕрд╢реБрджреНрдз" рдореЛрдирд╛рдб IOред
рдореЛрдирд╛рдбрд╣рд░реВ рдЧрдгрдирд╛рдХреЛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдЧрд░реНрдиреЗ рддрд░рд┐рдХрд╛ рд╣реЛ рдкреНрд░рднрд╛рд╡рд╣рд░реВ Haskell рдорд╛ред рддрд┐рдиреАрд╣рд░реВрд▓реЗ рдХрд╕рд░реА рдХрд╛рдо рдЧрд░реНрдЫрдиреН рднрдиреНрдиреЗ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдпрд╕ рдкреЛрд╕реНрдЯрдХреЛ рджрд╛рдпрд░рд╛рднрдиреНрджрд╛ рдмрд╛рд╣рд┐рд░ рдЫред рдЕрдВрдЧреНрд░реЗрдЬреАрдорд╛ рд░рд╛рдореНрд░реЛ рд░ рд╕реНрдкрд╖реНрдЯ рд╡рд┐рд╡рд░рдг рдкрдвреНрди рд╕рдХрд┐рдиреНрдЫ
рдпрд╣рд╛рдБ рдо рдпреЛ рдХреБрд░рд╛ рдФрдВрд▓реНрдпрд╛рдЙрди рдЪрд╛рд╣рдиреНрдЫреБ рдХрд┐ IO рдЬрд╕реНрддрд╛ рдХреЗрд╣реА рдореЛрдирд╛рдбрд╣рд░реВ рдХрдореНрдкрд╛рдЗрд▓рд░ рдореНрдпрд╛рдЬрд┐рдХ рдорд╛рд░реНрдлрдд рд▓рд╛рдЧреВ рдЧрд░рд┐рдПрдХрд╛ рдЫрдиреН, рд▓рдЧрднрдЧ рд╕рдмреИ рдЕрд░реВрд╣рд░реВ рд╕рдлреНрдЯрд╡реЗрдпрд░рдорд╛ рд▓рд╛рдЧреВ рдЧрд░рд┐рдПрдХрд╛ рдЫрдиреН рд░ рддрд┐рдиреАрд╣рд░реВрдорд╛ рднрдПрдХрд╛ рд╕рдмреИ рдЧрдгрдирд╛рд╣рд░реВ рд╢реБрджреНрдз рдЫрдиреНред
рддреНрдпрд╣рд╛рдБ рдзреЗрд░реИ рдкреНрд░рднрд╛рд╡рд╣рд░реВ рдЫрдиреН рд░ рдкреНрд░рддреНрдпреЗрдХрдХреЛ рдЖрдлреНрдиреИ рдореЛрдирд╛рдб рдЫред рдпреЛ рдПрдХ рдзреЗрд░реИ рдмрд▓рд┐рдпреЛ рд░ рд╕реБрдиреНрджрд░ рд╕рд┐рджреНрдзрд╛рдиреНрдд рд╣реЛ: рд╕рдмреИ рдореЛрдирд╛рдбрд╣рд░реВрд▓реЗ рдПрдЙрдЯреИ рдЗрдиреНрдЯрд░рдлреЗрд╕ рд▓рд╛рдЧреВ рдЧрд░реНрджрдЫред рд╣рд╛рдореА рдирд┐рдореНрди рддреАрди рдореЛрдирд╛рдбрд╣рд░реВрдХреЛ рдмрд╛рд░реЗрдорд╛ рдХреБрд░рд╛ рдЧрд░реНрдиреЗрдЫреМрдВ:
- рдпрд╛ рдд ea рдПрдЙрдЯрд╛ рдЧрдгрдирд╛ рд╣реЛ рдЬрд╕рд▓реЗ рдкреНрд░рдХрд╛рд░ a рдХреЛ рдорд╛рди рдлрд░реНрдХрд╛рдЙрдБрдЫ рд╡рд╛ рдкреНрд░рдХрд╛рд░ e рдХреЛ рдЕрдкрд╡рд╛рдж рдлреНрдпрд╛рдБрдХреНрдЫред рдпрд╕ рдореЛрдирд╛рдбрдХреЛ рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрдирд┐рд╡рд╛рд░реНрдп рднрд╛рд╖рд╛рд╣рд░реВрдорд╛ рдЕрдкрд╡рд╛рдж рд╣реНрдпрд╛рдиреНрдбрд▓рд┐рдЩрд╕рдБрдЧ рдорд┐рд▓реНрджреЛрдЬреБрд▓реНрджреЛ рдЫ: рддреНрд░реБрдЯрд┐рд╣рд░реВ рд╕рдорд╛рддреНрди рд╡рд╛ рдкрд╛рд╕ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред рдореБрдЦреНрдп рднрд┐рдиреНрдирддрд╛ рдпреЛ рд╣реЛ рдХрд┐ рдореЛрдирд╛рдб рдкреВрд░реНрдгрддрдпрд╛ рддрд╛рд░реНрдХрд┐рдХ рд░реВрдкрдорд╛ рд╣рд╛рд╕реНрдХреЗрд▓рдХреЛ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдпрдорд╛ рд▓рд╛рдЧреВ рдЧрд░рд┐рдПрдХреЛ рдЫ, рдЬрдмрдХрд┐ рдЕрдирд┐рд╡рд╛рд░реНрдп рднрд╛рд╖рд╛рд╣рд░реВрд▓реЗ рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛ рдЕрдкрд░реЗрдЯрд┐рдЩ рд╕рд┐рд╕реНрдЯрдо рд╕рдВрдпрдиреНрддреНрд░рд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдЫрдиреНред
- рд╕реНрдЯреЗрдЯ sa рдПрдХ рдЧрдгрдирд╛ рд╣реЛ рдЬрд╕рд▓реЗ рдкреНрд░рдХрд╛рд░ a рдХреЛ рдорд╛рди рдлрд░реНрдХрд╛рдЙрдБрдЫ рд░ рдкреНрд░рдХрд╛рд░ s рдХреЛ рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╕реНрдерд┐рддрд┐рдорд╛ рдкрд╣реБрдБрдЪ рдЫред
- рд╕рд╛рдпрдж рдП. рд╕рд╛рдпрдж рдореЛрдирд╛рдбрд▓реЗ рдХреБрдиреИ рдкрдирд┐ рд╕рдордпрдорд╛ рдХреЗрд╣рд┐ рдкрдирд┐ рдлрд░реНрдХрд╛рдПрд░ рдЕрд╡рд░реЛрдз рдЧрд░реНрди рд╕рдХреНрдиреЗ рдЧрдгрдирд╛ рд╡реНрдпрдХреНрдд рдЧрд░реНрджрдЫред рдпрджреНрдпрдкрд┐, рд╣рд╛рдореА рд╢рд╛рдпрдж рдкреНрд░рдХрд╛рд░рдХреЛ рд▓рд╛рдЧрд┐ рдореЛрдирд╛рдбрдкреНрд▓рд╕ рд╡рд░реНрдЧрдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдХреЛ рдмрд╛рд░реЗрдорд╛ рдХреБрд░рд╛ рдЧрд░реНрдиреЗрдЫреМрдВ, рдЬрд╕рд▓реЗ рд╡рд┐рдкрд░рд┐рдд рдкреНрд░рднрд╛рд╡рд▓рд╛рдИ рд╡реНрдпрдХреНрдд рдЧрд░реНрджрдЫ: рдпреЛ рдПрдХ рдЧрдгрдирд╛ рд╣реЛ рдЬреБрди рдХреБрдиреИ рдкрдирд┐ рд╕рдордпрдорд╛ рдирд┐рд╢реНрдЪрд┐рдд рдорд╛рди рдлрд░реНрдХрд╛рдПрд░ рдЕрд╡рд░реЛрдз рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред
рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рд╣рд╛рдореАрд╕рдБрдЧ рджреБрдИрд╡рдЯрд╛ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░рд╣рд░реВ рдЫрдиреН, рдЧреНрд░рд╛рдл рдП рд░ рдмрд┐рдЧреНрд░рд╛рдл ab, рдЬрд╕рдордзреНрдпреЗ рдкрд╣рд┐рд▓реЛрд▓реЗ рдЯрд╛рдЗрдк a рдХреЛ рдорд╛рдирд╣рд░реВрд╕рдБрдЧ рд▓реЗрдмрд▓ рдЧрд░рд┐рдПрдХрд╛ рдард╛рдбреЛрд╣рд░реВрд╕рд╣рд┐рдд рдЧреНрд░рд╛рдлрд╣рд░реВ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдЧрд░реНрджрдЫ, рд░ рджреЛрд╕реНрд░реЛрд▓реЗ рдЯрд╛рдЗрдк a рд░ рджрд╛рдпрд╛рдБрдХреЛ рдорд╛рдирд╣рд░реВрд╕рдБрдЧ рд▓реЗрдмрд▓ рдЧрд░рд┐рдПрдХреЛ рдмрд╛рдпрд╛рдБ-рд╕рд╛рдЗрдб рдард╛рдбреЛрд╣рд░реВрд╕рд╣рд┐рдд рджреНрд╡рд┐рдкрдХреНрд╖реАрдп рдЧреНрд░рд╛рдлрд╣рд░реВ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдЧрд░реНрджрдЫред - рдкреНрд░рдХрд╛рд░ b рдХреЛ рдорд╛рдирд╣рд░реВрд╕рдБрдЧ рд▓реЗрдмрд▓ рдЧрд░рд┐рдПрдХреЛ рдЫреЗрдЙрдЫреЗрдЙрд╣рд░реВред
рдпреА рдПрд▓реНрдЧрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдпрдХрд╛ рдкреНрд░рдХрд╛рд░рд╣рд░реВ рд╣реЛрдЗрдирдиреНред рдЕрд▓реНрдЧрд╛рд╕рдБрдЧ рдЕрдирд┐рд░реНрджреЗрд╢рд┐рдд рджреНрд╡рд┐рдкрдХреНрд╖реАрдп рдЧреНрд░рд╛рдлрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдЫреИрдиред рдореИрд▓реЗ рд╕реНрдкрд╖реНрдЯрддрд╛рдХреЛ рд▓рд╛рдЧрд┐ рдпрд╕ рдкреНрд░рдХрд╛рд░рд╣рд░реВ рдмрдирд╛рдПрдХреЛ рдЫреБред
рд╣рд╛рдореАрд▓рд╛рдИ рдирд┐рдореНрди рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд╣рд░реВрдХреЛ рд╕рд╛рде рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдпрд╣рд░реВ рдкрдирд┐ рдЪрд╛рд╣рд┐рдиреНрдЫ:
-- ╨б╨┐╨╕╤Б╨╛╨║ ╤Б╨╛╤Б╨╡╨┤╨╡╨╣ ╨┤╨░╨╜╨╜╨╛╨╣ ╨▓╨╡╤А╤И╨╕╨╜╤Л.
neighbours :: Ord a => a -> Graph a -> [a]
-- ╨Я╨╛╤Б╤В╤А╨╛╨╕╤В╤М ╨┤╨▓╤Г╨┤╨╛╨╗╤М╨╜╤Л╨╣ ╨│╤А╨░╤Д ╨┐╨╛ ╨│╤А╨░╤Д╤Г ╨╕ ╤Д╤Г╨╜╨║╤Ж╨╕╨╕, ╨┤╨╗╤П ╨║╨░╨╢╨┤╨╛╨╣ ╨▓╨╡╤А╤И╨╕╨╜╤Л
-- ╨▓╤Л╨┤╨░╤О╤Й╨╡╨╣ ╨╡╤С ╨┤╨╛╨╗╤О ╨╕ ╨┐╨╛╨╝╨╡╤В╨║╤Г ╨▓ ╨╜╨╛╨▓╨╛╨╣ ╨┤╨╛╨╗╨╡, ╨╕╨│╨╜╨╛╤А╨╕╤А╤Г╤П ╨║╨╛╨╜╤Д╨╗╨╕╨║╤В╨╜╤Л╨╡ ╤А╤С╨▒╤А╨░.
toBipartiteWith :: (Ord a, Ord b, Ord c) => (a -> Either b c)
-> Graph a
-> Bigraph b c
-- ╨б╨┐╨╕╤Б╨╛╨║ ╨▓╨╡╤А╤И╨╕╨╜ ╨▓ ╨│╤А╨░╤Д╨╡
vertexList :: Ord a => Graph a -> [a]
╨б╨╕╨│╨╜╨░╤В╤Г╤А╨░ ╤Д╤Г╨╜╨║╤Ж╨╕╨╕, ╨║╨╛╤В╨╛╤А╤Г╤О ╨╝╤Л ╨▒╤Г╨┤╨╡╨╝ ╨┐╨╕╤Б╨░╤В╤М, ╨▓╤Л╨│╨╗╤П╨┤╨╕╤В ╤В╨░╨║:
type OddCycle a = [a]
detectParts :: Ord a => Graph a -> Either (OddCycle a) (Bigraph a a)
рдпреЛ рд╣реЗрд░реНрди рд╕рдЬрд┐рд▓реЛ рдЫ рдХрд┐ рдпрджрд┐ рдЧрд╣рд┐рд░рд╛рдИ-рдкрд╣рд┐рд▓реЛ рдЦреЛрдЬрдХреЛ рдХреНрд░рдордорд╛ рд╣рд╛рдореАрд▓реЗ рдПрдХ рд╡рд┐рд╡рд╛рджрд┐рдд рдХрд┐рдирд╛рд░рд╛ рдлреЗрд▓рд╛ рдкрд╛рд░реНрдпреМрдВ рднрдиреЗ, рд╡рд┐рдЪрд┐рддреНрд░ рдЪрдХреНрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╕реНрдЯреНрдпрд╛рдХрдХреЛ рд╢реАрд░реНрд╖рдорд╛ рдЫред рдпрд╕реИрд▓реЗ, рдпрд╕рд▓рд╛рдИ рдкреБрдирд░реНрд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрди, рд╣рд╛рдореАрд▓реЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╕реНрдЯреНрдпрд╛рдХрдмрд╛рдЯ рдЕрдиреНрддрд┐рдо рднреЗрд░реНрдЯреЗрдХреНрд╕рдХреЛ рдкрд╣рд┐рд▓реЛ рдШрдЯрдирд╛ рд╕рдореНрдо рд╕рдмреИ рдЪреАрдЬрд╣рд░реВ рдХрд╛рдЯреНрдиреБ рдкрд░реНрдЫред
рд╣рд╛рдореА рдкреНрд░рддреНрдпреЗрдХ vertex рдХреЛ рд▓рд╛рдЧрд┐ рд╕рд╛рдЭрд╛ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдПрдХ рд╕рд╣рдпреЛрдЧреА рд╕рд░рдгреА рдХрд╛рдпрдо рдЧрд░реЗрд░ рдЧрд╣рд┐рд░рд╛рдИ-рдкрд╣рд┐рд▓реЛ рдЦреЛрдЬ рд▓рд╛рдЧреВ рдЧрд░реНрдЫреМрдВред рд╣рд╛рдореАрд▓реЗ рд░реЛрдЬреЗрдХреЛ рдореЛрдирд╛рдбрдХреЛ рдлрдВрдХреНрдЯрд░ рдХреНрд▓рд╛рд╕рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдорд╛рд░реНрдлрдд рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╕реНрдЯреНрдпрд╛рдХ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдкрдорд╛ рдХрд╛рдпрдо рд╣реБрдиреЗрдЫ: рд╣рд╛рдореАрд▓реЗ рдкреБрдирд░рд╛рд╡рд░реНрддреА рдкреНрд░рдХрд╛рд░реНрдпрдмрд╛рдЯ рдлрд┐рд░реНрддрд╛ рдЖрдПрдХреЛ рдирддрд┐рдЬрд╛рдорд╛ рдкрдердмрд╛рдЯ рд╕рдмреИ рд╢реАрд░реНрд╖рд╣рд░реВ рдорд╛рддреНрд░ рд░рд╛рдЦреНрди рдЖрд╡рд╢реНрдпрдХ рд╣реБрдиреЗрдЫред
рдореЗрд░реЛ рдкрд╣рд┐рд▓реЛ рд╡рд┐рдЪрд╛рд░ Either monad рдХреЛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБ рдерд┐рдпреЛ, рдЬрд╕рд▓реЗ рд╣рд╛рдореАрд▓рд╛рдИ рдЪрд╛рд╣рд┐рдиреЗ рдкреНрд░рднрд╛рд╡рд╣рд░реВ рд▓рд╛рдЧреВ рдЧрд░реНрджрдЫред рдореИрд▓реЗ рд▓реЗрдЦреЗрдХреЛ рдкрд╣рд┐рд▓реЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдпреЛ рд╡рд┐рдХрд▓реНрдкрдХреЛ рдзреЗрд░реИ рдирдЬрд┐рдХ рдерд┐рдпреЛред рд╡рд╛рд╕реНрддрд╡рдорд╛, рдорд╕рдБрдЧ рдПрдХ рдмрд┐рдиреНрджреБрдорд╛ рдкрд╛рдБрдЪрд╡рдЯрд╛ рдлрд░рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирд╣рд░реВ рдерд┐рдП рд░ рдЕрдиреНрддрддрдГ рдЕрд░реНрдХреЛрдорд╛ рдмрд╕реЗред
рдкрд╣рд┐рд▓реЗ, рд╣рд╛рдореАрд▓реЗ рд╕рд╛рдЭрд╛ рдкрд╣рд┐рдЪрд╛рдирдХрд░реНрддрд╛рд╣рд░реВрдХреЛ рд╕рд╣рдпреЛрдЧреА рдПрд░реЗ рдХрд╛рдпрдо рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ - рдпреЛ рд░рд╛рдЬреНрдпрдХреЛ рдмрд╛рд░реЗрдорд╛ рдХреЗрд╣рд┐ рд╣реЛред рджреЛрд╕реНрд░реЛ, рджреНрд╡рдиреНрджреНрд╡ рдкрддреНрддрд╛ рд▓рд╛рдЧреНрджрд╛ рд╣рд╛рдореАрд▓реЗ рд░реЛрдХреНрди рд╕рдХреНрд╖рдо рд╣реБрдиреБрдкрд░реНрджрдЫред рдпреЛ рдпрд╛ рдд рдХреЛ рд▓рд╛рдЧрд┐ Monad, рд╡рд╛ MonadPlus рд╣реБрди рд╕рдХреНрдЫред рдореБрдЦреНрдп рднрд┐рдиреНрдирддрд╛ рдпреЛ рд╣реЛ рдХрд┐ рдпрд╛ рдд рдорд╛рди рдлрд┐рд░реНрддрд╛ рдЧрд░реНрди рд╕рдХреНрдЫ рдпрджрд┐ рдЧрдгрдирд╛ рд░реЛрдХрд┐рдПрдХреЛ рдЫреИрди, рд░ рд╣реБрдирд╕рдХреНрдЫ рдпрд╕ рдЕрд╡рд╕реНрдерд╛рдорд╛ рдпрд╕ рдмрд╛рд░реЗ рдЬрд╛рдирдХрд╛рд░реА рдорд╛рддреНрд░ рдлрд░реНрдХрд╛рдЙрдБрдЫред рд╣рд╛рдореАрд▓рд╛рдИ рд╕рдлрд▓рддрд╛рдХреЛ рд▓рд╛рдЧрд┐ рдЫреБрдЯреНрдЯреИ рдореВрд▓реНрдпрдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдкрд░реНрджреИрди (рдпреЛ рд░рд╛рдЬреНрдпрдорд╛ рдкрд╣рд┐рд▓реЗ рдиреИ рднрдгреНрдбрд╛рд░рдг рдЧрд░рд┐рдПрдХреЛ рдЫ), рд╣рд╛рдореА рд╕рд╛рдпрдж рдЫрдиреМрдЯ рдЧрд░реНрдЫреМрдВред рд░ рдпрд╕ рдХреНрд╖рдгрдорд╛ рдЬрдм рд╣рд╛рдореАрд▓реЗ рджреБрдИ рдореЛрдирд╛рдбрд╣рд░реВрдХреЛ рдкреНрд░рднрд╛рд╡рд╣рд░реВ рд╕рдВрдпреЛрдЬрди рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ, рддрд┐рдиреАрд╣рд░реВ рдмрд╛рд╣рд┐рд░ рдЖрдЙрдБрдЫрдиреН
рдореИрд▓реЗ рдХрд┐рди рдпрд╕реНрддреЛ рдЬрдЯрд┐рд▓ рдкреНрд░рдХрд╛рд░ рд░реЛрдЬреЗрдВ? рджреБрдИ рдХрд╛рд░рдгред рдкрд╣рд┐рд▓реЛ, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдкрдорд╛ рдзреЗрд░реИ рдорд┐рд▓реНрджреЛрдЬреБрд▓реНрджреЛ рдЫред рджреЛрд╕реНрд░реЛ, рд╡рд┐рдЪрд┐рддреНрд░ рд▓реВрдк рдкреБрдирд░реНрд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрди рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдмрд╛рдЯ рдлрд┐рд░реНрддрд╛ рдЧрд░реНрджрд╛ рджреНрд╡рдиреНрджреНрд╡рдХреЛ рдЕрд╡рд╕реНрдерд╛рдорд╛ рд╣рд╛рдореАрд▓реЗ рдлрд┐рд░реНрддрд╛ рдореВрд▓реНрдпрд▓рд╛рдИ рд╣реЗрд░рдлреЗрд░ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ, рдЬреБрди рд╢рд╛рдпрдж рдореЛрдирд╛рдбрдорд╛ рдЧрд░реНрди рдзреЗрд░реИ рд╕рдЬрд┐рд▓реЛ рдЫред
рдпрд╕рд░реА рд╣рд╛рдореА рдпреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдЫреМрдВред
{-# LANGUAGE ExplicitForAll #-}
{-# LANGUAGE ScopedTypeVariables #-}
data Part = LeftPart | RightPart
otherPart :: Part -> Part
otherPart LeftPart = RightPart
otherPart RightPart = LeftPart
type PartMap a = Map.Map a Part
type OddCycle a = [a]
toEither :: Ord a => PartMap a -> a -> Either a a
toEither m v = case fromJust (v `Map.lookup` m) of
LeftPart -> Left v
RightPart -> Right v
type PartMonad a = MaybeT (State (PartMap a)) [a]
detectParts :: forall a. Ord a => Graph a -> Either (OddCycle a) (Bigraph a a)
detectParts g = case runState (runMaybeT dfs) Map.empty of
(Just c, _) -> Left $ oddCycle c
(Nothing, m) -> Right $ toBipartiteWith (toEither m) g
where
inVertex :: Part -> a -> PartMonad a
inVertex p v = ((:) v) <$> do modify $ Map.insert v p
let q = otherPart p
msum [ onEdge q u | u <- neigbours v g ]
{-# INLINE onEdge #-}
onEdge :: Part -> a -> PartMonad a
onEdge p v = do m <- get
case v `Map.lookup` m of
Nothing -> inVertex p v
Just q -> do guard (q /= p)
return [v]
processVertex :: a -> PartMonad a
processVertex v = do m <- get
guard (v `Map.notMember` m)
inVertex LeftPart v
dfs :: PartMonad a
dfs = msum [ processVertex v | v <- vertexList g ]
oddCycle :: [a] -> [a]
oddCycle c = tail (dropWhile ((/=) last c) c)
рдЬрд╣рд╛рдБ рдмреНрд▓рдХ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рдореВрд▓ рд╣реЛред рдо рднрд┐рддреНрд░ рдХреЗ рднрдЗрд░рд╣реЗрдХреЛ рдЫ рднрдиреЗрд░ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдЧрд░реНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрдиреЗрдЫреБред
- inVertex depth-first search рдХреЛ рднрд╛рдЧ рд╣реЛ рдЬрд╣рд╛рдБ рд╣рд╛рдореА рдкрд╣рд┐рд▓реЛ рдкрдЯрдХ рднреЗрд░реНрдЯреЗрдХреНрд╕рдорд╛ рдЬрд╛рдиреНрдЫреМрдВред рдпрд╣рд╛рдБ рд╣рд╛рдореА рднреЗрд░реНрдЯреЗрдХреНрд╕рдорд╛ рд╕реЗрдпрд░ рдирдореНрдмрд░ рддреЛрдХреНрдЫреМрдВ рд░ рд╕рдмреИ рдЫрд┐рдореЗрдХреАрд╣рд░реВрдорд╛ onEdge рдЪрд▓рд╛рдЙрдБрдЫреМрдВред рдпреЛ рдкрдирд┐ рд╣реЛ рдЬрд╣рд╛рдБ рд╣рд╛рдореА рдХрд▓ рд╕реНрдЯреНрдпрд╛рдХ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдЧрд░реНрдЫреМрдВ: рдпрджрд┐ msum рд▓реЗ рдорд╛рди рдлрд░реНрдХрд╛рдЙрдБрдЫ рднрдиреЗ, рд╣рд╛рдореА vertex v рддреНрдпрд╣рд╛рдБ рдкреБрд╢ рдЧрд░реНрдЫреМрдВред
- onEdge рддреНрдпреЛ рднрд╛рдЧ рд╣реЛ рдЬрд╣рд╛рдБ рд╣рд╛рдореА рдХрд┐рдирд╛рд░рд╛рдорд╛ рдЬрд╛рдиреНрдЫреМрдВред рдпрд╕рд▓рд╛рдИ рдкреНрд░рддреНрдпреЗрдХ рдХрд┐рдирд╛рд░рд╛рдХреЛ рд▓рд╛рдЧрд┐ рджреБрдИ рдкрдЯрдХ рднрдирд┐рдиреНрдЫред рдпрд╣рд╛рдБ рд╣рд╛рдореА рдЬрд╛рдБрдЪ рдЧрд░реНрдЫреМрдВ рдХрд┐ рдЕрд░реНрдХреЛ рдЫреЗрдЙрдХреЛ рднреЗрд░реНрдЯреЗрдХреНрд╕ рднреНрд░рдордг рдЧрд░рд┐рдПрдХреЛ рдЫ, рд░ рдпрджрд┐ рдЫреИрди рднрдиреЗ рдпрд╕рд▓рд╛рдИ рднреНрд░рдордг рдЧрд░реНрдиреБрд╣реЛрд╕реНред рдпрджрд┐ рднреНрд░рдордг рдЧрд░рд┐рдПрдХреЛ рдЫ рднрдиреЗ, рд╣рд╛рдореА рдХрд┐рдирд╛рд░рд╛ рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕реА рдЫ рдХрд┐ рдЫреИрди рдЬрд╛рдБрдЪ рдЧрд░реНрдЫреМрдВред рдпрджрд┐ рдпреЛ рд╣реЛ рднрдиреЗ, рд╣рд╛рдореА рдорд╛рди рдлрд┐рд░реНрддрд╛ рдЧрд░реНрдЫреМрдВ - рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╕реНрдЯреНрдпрд╛рдХрдХреЛ рдПрдХрджрдо рд╢реАрд░реНрд╖, рдЬрд╣рд╛рдБ рдЕрдиреНрдп рд╕рдмреИ рдард╛рдбреЛрд╣рд░реВ рдлрд┐рд░реНрддрд╛рдорд╛ рд░рд╛рдЦрд┐рдиреЗрдЫред
- processVertex рд▓реЗ рдкреНрд░рддреНрдпреЗрдХ рднреЗрд░реНрдЯреЗрдХреНрд╕рдХреЛ рд▓рд╛рдЧрд┐ рдЬрд╛рдБрдЪ рдЧрд░реНрджрдЫ рдХрд┐ рдпреЛ рднреНрд░рдордг рдЧрд░рд┐рдПрдХреЛ рдЫ рд░ рдпрджрд┐ рдЫреИрди рднрдиреЗ рдпрд╕рдорд╛ рднрд░реНрдЯреЗрдХреНрд╕ рдЪрд▓реНрдЫред
- dfs рд╕рдмреИ рдард╛рдбреЛрд╣рд░реВрдорд╛ processVertex рдЪрд▓рд╛рдЙрдБрдЫред
рдпрддрд┐ рдиреИред
рдЗрдирд▓рд╛рдЗрди рд╢рдмреНрджрдХреЛ рдЗрддрд┐рд╣рд╛рд╕
INLINE рд╢рдмреНрдж рдПрд▓реНрдЧреЛрд░рд┐рдереНрдордХреЛ рдкрд╣рд┐рд▓реЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдорд╛ рдерд┐рдПрди; рдпреЛ рдкрдЫрд┐ рджреЗрдЦрд╛ рдкрд░реНтАНрдпреЛред рдЬрдм рдореИрд▓реЗ рд░рд╛рдореНрд░реЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЦреЛрдЬреНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реЗрдВ, рдореИрд▓реЗ рдлреЗрд▓рд╛ рдкрд╛рд░реЗ рдХрд┐ рдЧреИрд░-рдЗрдирд▓рд╛рдЗрди рд╕рдВрд╕реНрдХрд░рдг рдХреЗрд╣реА рдЧреНрд░рд╛рдлрд╣рд░реВрдорд╛ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд░реВрдкрдорд╛ рдврд┐рд▓реЛ рдерд┐рдпреЛред рд╕рд┐рдореЗрдиреНрдЯрд┐рдХ рд░реВрдкрдорд╛ рдХрд╛рд░реНрдпрд╣рд░реВрд▓реЗ рд╕рдорд╛рди рдХрд╛рдо рдЧрд░реНрдиреБрдкрд░реНрдЫ рднрдиреНрдиреЗ рдХреБрд░рд╛рд▓рд╛рдИ рдзреНрдпрд╛рдирдорд╛ рд░рд╛рдЦреНрджреИ, рдпрд╕рд▓реЗ рдорд▓рд╛рдИ рдзреЗрд░реИ рдЫрдХреНрдХ рдкрд╛рд░реНрдпреЛред рдЕрдкрд░рд┐рдЪрд┐рдд рдкрдирд┐, GHC рдХреЛ рдлрд░рдХ рд╕рдВрд╕реНрдХрд░рдгрдХреЛ рд╕рд╛рде рдЕрд░реНрдХреЛ рдореЗрд╕рд┐рдирдорд╛ рдХреБрдиреИ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рднрд┐рдиреНрдирддрд╛ рдерд┐рдПрдиред
GHC рдХреЛрд░ рдЖрдЙрдЯрдкреБрдЯ рдкрдвреЗрд░ рдПрдХ рд╣рдкреНрддрд╛ рдмрд┐рддрд╛рдПрдкрдЫрд┐, рдореИрд▓реЗ рд╕реНрдкрд╖реНрдЯ INLINE рдХреЛ рдПрдХ рд▓рд╛рдЗрдирдХреЛ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрди рд╕рдХреНрд╖рдо рднрдПрдБред GHC 8.4.4 рд░ GHC 8.6.5 рдХреЛ рдмреАрдЪрдорд╛ рдХреЗрд╣рд┐ рдмрд┐рдиреНрджреБрдорд╛ рдЕрдиреБрдХреВрд▓рдХрд▓реЗ рдпреЛ рдЖрдлреИрдВ рдЧрд░реНрди рдмрдиреНрдж рдЧрд░реНрдпреЛред
рдореИрд▓реЗ рд╣рд╕реНрдХреЗрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдЩрдорд╛ рдпрд╕реНрддреЛ рдлреЛрд╣реЛрд░рдХреЛ рд╕рд╛рдордирд╛ рдЧрд░реНрдиреЗ рдЖрд╢рд╛ рдЧрд░реЗрдиред рдпрджреНрдпрдкрд┐, рдЖрдЬ рдкрдирд┐, рдЕрдкреНрдЯрд┐рдорд╛рдЗрдЬрд░рд╣рд░реВрд▓реЗ рдХрд╣рд┐рд▓реЗрдХрд╛рд╣реАрдВ рдЧрд▓реНрддреА рдЧрд░реНрдЫрдиреН, рд░ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рд╕рдВрдХреЗрдд рджрд┐рдиреБ рд╣рд╛рдореНрд░реЛ рдХрд╛рдо рд╣реЛред рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдпрд╣рд╛рдБ рд╣рд╛рдореАрд▓рд╛рдИ рдерд╛рд╣рд╛ рдЫ рдХрд┐ рдкреНрд░рдХрд╛рд░реНрдп рдЗрдирд▓рд╛рдЗрди рд╣реБрдиреБрдкрд░реНрдЫ рдХрд┐рдирднрдиреЗ рдпреЛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд╕рдВрд╕реНрдХрд░рдгрдорд╛ рдЗрдирд▓рд╛рдЗрди рдЧрд░рд┐рдПрдХреЛ рдЫ, рд░ рдпреЛ рдХрдореНрдкрд╛рдЗрд▓рд░рд▓рд╛рдИ рд╕рдВрдХреЗрдд рджрд┐рдиреЗ рдХрд╛рд░рдг рд╣реЛред
рдЕрдирд┐ рдХреЗ рднрдпреЛ?
рддреНрдпрд╕рдкрдЫрд┐ рдореИрд▓реЗ рдЕрдиреНрдп рдореЛрдирд╛рдбрд╣рд░реВрд╕рдБрдЧ Hopcroft-Karp рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд▓рд╛рдЧреВ рдЧрд░реЗрдВ, рд░ рддреНрдпреЛ рдХрд╛рд░реНрдпрдХреНрд░рдордХреЛ рдЕрдиреНрддреНрдп рдерд┐рдпреЛред
рдЧреБрдЧрд▓ рд╕рдорд░ рдЕрдл рдХреЛрдбрдХреЛ рд▓рд╛рдЧрд┐ рдзрдиреНрдпрд╡рд╛рдж, рдореИрд▓реЗ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдЩрдорд╛ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЕрдиреБрднрд╡ рдкреНрд░рд╛рдкреНрдд рдЧрд░реЗрдВ, рдЬрд╕рд▓реЗ рдорд▓рд╛рдИ рдЕрд░реНрдХреЛ рдЧрд░реНрдореАрдорд╛ рдЬреЗрди рд╕реНрдЯреНрд░рд┐рдЯрдорд╛ рдЗрдиреНрдЯрд░реНрдирд╢рд┐рдк рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рдорджреНрджрдд рдЧрд░реНтАНрдпреЛ (рдорд▓рд╛рдИ рдерд╛рд╣рд╛ рдЫреИрди рдХрд┐ рдпреЛ рдард╛рдЙрдБ рд╣рд╛рдмреНрд░рдХрд╛ рдЬрд╛рдирдХрд╛рд░ рджрд░реНрд╢рдХрд╣рд░реВрдорд╛рдЭ рдкрдирд┐ рдХрддреНрддрд┐рдХреЛ рдкрд░рд┐рдЪрд┐рдд рдЫ, рддрд░ рдпреЛ рдПрдЙрдЯрд╛ рд╣реЛред рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдЩрдорд╛ рд╕рдВрд▓рдЧреНрди рд╣реБрдирдХреЛ рд▓рд╛рдЧрд┐ рддрдкрд╛рдИрдВ рд╕рдорд░ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рднрдиреНрдиреЗ рдХреЗрд╣реА рдордзреНрдпреЗ), рддрд░ рдпрд╕рд▓реЗ рдорд▓рд╛рдИ рдкрд░рдореНрдкрд░рд╛рдЧрдд рднрд╛рд╖рд╛рд╣рд░реВрдорд╛ рдореЗрд░реЛ рдЕрдиреБрднрд╡ рднрдиреНрджрд╛ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд░реВрдкрдорд╛ рдлрд░рдХ рд╡реНрдпрд╡рд╣рд╛рд░рдорд╛ рдпреЛ рдкреНрд░рддрд┐рдорд╛рди рд▓рд╛рдЧреВ рдЧрд░реНрдиреЗ рдЕрджреНрднреБрдд рд╕рдВрд╕рд╛рд░рдорд╛ рдкрд░рд┐рдЪрдп рдЧрд░рд╛рдПрдХреЛ рдЫред
рд╕реНрд░реЛрдд: www.habr.com