$ Sol $
Во-первых, найти точку в квалификации, а затем побежал, как пара $ SPFA $.
Как определить, является ли условия для его точки? Еще до анти-стороны, запись каждой точки, а затем начать с конца $ Dfs $, записать число достигло каждой точки, если число раз равное его досягаемости в градусах и не $ 0 $ то, что отвечают смысл вопросов.
Почему $ $ Noip2014 $ 4 $ Дориана Я чувствую саму проблему воды.
$ Код $
#include <iostream> #include <cstdio> #include <CString> #include <очереди> #include <алгоритм> #define IL инлайн #define Rg регистре #define идти (я, а, б) для (Rg INT I = а ; г <= Ь; ++ я) #define да (я, а, б) для (Rg INT I = а, я> = Ь, - я) #define е (я, и) для (Rg ИНТ я = Ь [и]; я; I = A [I] .nt) #define MEM (а, б) MemSet (а, б, SizeOf (а)) #define LL долго долго #define дБ двойной #define инф 2147483647 используя Пространство имен станд; иль ИНТ чтения () { RgINT х = 0 , у = 1 ; символ с = GetChar (); в то время как (с < ' 0 ' || с> ' 9 ' ) { если (с == ' - ' ) у = - 1 ; с = GetChar ();} , а (с> = ' 0 ' && с <= ' 9 ' ) {х = (х << 1 ) + (х << 3 ) + с- ' 0 ' ; с = GetChar ();} возвращение х * у; N = 10010 , М = 200010 ; INT п, т, б [N], CT, дю [N], с, т, по отношению [N], дис [N]; BOOL П [Н]; Очередь < INT > д; структура ND1 { Int U, V;} , например , [М]; структура й { INT v, нт;} а [М]; IL недействительными добавить ( INT и, INT v) {а [++ кт] = (й) {v, Ь [и]}; б [и] = кт;} IL аннулируются ДФС ( INT и) { е (я, и) { Rg INT V = а [я] .v; Vis [v] ++ ; если ( по отношению [v]>1 ) продолжить ; ДФС (v); } } IL недействительный SPFA () { MEM (Vis, 0 ); MEM (дис, 63 ); по отношению [с] = 1 ; дис [с] = 0 ; q.push (с); в то время как (! q.empty ()) { Rg ИНТ и = q.front (); q.pop () по отношению [и] = 0 ; е (я, и) { Rg INT V = а [я] .v; если (П [v]!) по- прежнему ; если(дис [v]> дис [U] + 1 ) { дис [v] = дис [и] + 1 ; если {визави [v] = (визави [v]!) 1 ; q.push (v);} } } } } иль BOOL CMP (ND1 х, ND1 у) { возвращение Xu == уи хи <уи: Xu < ю;} INT основных () { п = следующим образом (), т = следующим образом (); перейти (я, 1 , м) { Rg INT и = следующим образом (), V = следующим образом (); если (и == v) продолжить ; например , [I]= (ND1) {U, V}; // добавить (v, и), ди [и] ++; } Сортировки (например , + 1 , например , + т + 1 , CMP); Rg INT нм = 0 ; перейти (я, 1 , м) { если (например , [я] == .u , например , [i - 1 ] .u && , например , [я] .в == например , [i - 1 ] .в) {нм ++; продолжить ;} добавить (например , [я] .в, например , [я] .u), ди [например , [я] .u] ++ ; } М - = нм; s = следующим образом (), Т = следующим образом (); подкачки (с, т); VIS [с] = 1 ; ДФС (с); идти (я,1 , п) , если (( по отношению [я] == дю [I] && отношению [I]) || я == ы) П [I] = 1 ; если (! П [с]) {Е ( " -1 \ п " ); возвращать 0 ;} SPFA (); если (дис [т]> М) Е ( " -1 \ п " ); еще Е ( " % d \ п " , дис [т]); вернуться 0 ; }