$ソル$
まず、予選でポイントを検索し、$ SPFA $のペアのよう走りました。
どのようにしても抗側の前に、各点の記録は、その後、各ポイントに到達した回数を記録し、最後の$のDFS $から始める?そのポイントの条件かどうかを判断する場合度とないにその範囲に等しい回数質問の意味を満たすその後、$ 0 $。
なぜ、$ $ Noip2014 $ 4 $ドリアンを持って、私は非常に水の問題を感じます。
$コード$
書式#include <iostreamの> の#include <cstdioを> する#include <CStringの> の#include <キュー> の#include <アルゴリズム> に#define ILインライン の#define Rgを登録し ます。#define行く(I、A、B)は(RG int型I = A ; iが<= Bと; ++ i)は、 の#defineはい(I、B)(RG INT I = Aの; I> = B; - I) の#define E(I、U)のために(RG INT I = B [U]; iが[I] .nt)=;私 の#defineを MEM(A、B)のmemset(A、B、はsizeof(A)) の#defineっ長い長 の#define DB二重 の#define INF 2147483647を 使用して 名前空間はstd; ILのINTのリード() { RgをINT X = 0、Y = 1。チャー C = GETCHAR()。 一方、(C < ' 0 ' || C> ' 9 '){ もし、(C == ' - ')Y = - 1 ; C = GETCHAR();} 一方、(C> = ' 0 ' && C <= ' 9 '){X =(X << 1)+(X << 3)+ C- ' 0 ' ; C = GETCHAR();} 戻りのx *のY。 N = 10010、M = 200010 。 INTのN、M、デュ[N]、CT、[N]、B、S、T、VIS [N]、DIS [N]。 BOOL FL [N]。 キュー < 整数 > Q; 構造体 ND1 { int型、UがV;}例えば、[M]。 構造体 ND { int型V、NT;} [M]。 IL ボイド追加(INT U、INT V){[++ CT] =(ND){V、B [U]}; B [U]は= CT;} IL 空隙 DFS(INT U) { E(I、 U) { RgをINT V = [I] .V; VIS [V] ++ ; もし(VIS [V]>1)続けます。 DFS(V); } } IL ボイドSPFA() { MEM(VIS、0); MEM(DIS、63 )。 VIS [S] = 1 ; DIS [S] = 0 ; q.push(S); 一方、(!q.empty()) { RgをINT ; q.pop(); U = q.front()VIS [U] = 0 ; E(I、U) { RgをINT V = [I] .V。 もし(FL [V]!)続けます。 もし(DIS [V]> DIS [U] + 1 ) { DIS [V] = DIS [U] + 1 。 もし {VIS [V] =(VIS [V]!)1 ; q.push(V);} } } } } IL ブール CMP(ND1のX、ND1のY){ 戻り徐==湯XV <YV:徐< 湯;} int型のmain() { N =(読み取り)、M = (読み取り) 行く(I、1 、M) { RgをINT U =読み取る()、V = 読み取ります(); もし(uが== v)を継続。 例えば、[I] =(ND1){U、V}。// 追加(V、U);デュ[U] ++; } ソート(例えば + 1、例えば+ M + 1 、CMP)。 RG INT NM = 0 ; 行く(I、1 、M) { 場合(例えば、[I] .U ==例えば、[I- 1 ] .U &&例えば、[I] .V ==例えば、[I- 1 ] .V){NM ++。継続}; 追加(例えば、[I] .V、例えば、[I] .U);デュ[例えば、[I] .U] ++ ; } M - = NM。 Sの =は、Tは=)(リード)(リード;スワップ(S、T)。 VIS [S] = 1 ; DFS(S); 行く(I、 1、n)の場合((VIS [I] ==デュ[I] && VIS [I])|| I == S)FL [I] = 1 。 もし(!FL [S]){のprintf(" -1の\ n "); 戻り 0 ;} SPFA()。 もし(DIS [T]> M)のprintf(" -1の\ n " ); 他のprintf(" %d個の\ n " 、DIS [T])。 リターン 0 ; }