UOJ#494K最短ポイント

書式#include <cstdioを> 
する#include <iostreamの> 
の#include <CStringの> 
の#include <キュー> 
の#define N 100007 
の#define Q千億七
名前空間stdを使用。
N INT、M、K、S、T、SPE [15]、TOT、LS [N]、CNT。
長い長いANS、DIS [N]、D [15] [15]。
ブールB [N]、V [40]。
キュー<整数> Q; 

構造体縁{ 
    次に、W、にINT。
} E [N]。

インラインint型リード(){ 
	int型、S = 0、W = 1。
	チャーCH = GETCHAR()。
	(CH < '0' || CH> '9'){一方
		{ - ( '' == CH)場合
			; = W -1 
		} 
		CH = GETCHAR()。
	} 
	(CH> = '0' && CH <= '9')、一方{ 
		S = Sで* 10 + CH-'0' 。
		CH = GETCHAR()。
	}  
	戻りS * W。
}

ボイド追加(int型のx、int型のY、int型Z){ 
    E [++ TOT] .TO = Y。
    E [TOT] .W = Z。
    E [TOT] .next = LSを[X]。
    LS [X] = TOT。
} 

ボイドspfa(INT X){ 
    memsetの(B、0、はsizeof(b)参照)。
    {ための式(I ++はint型i = 1; iが<= N)
        DIS [i]は= Qと、
    } 
    DIS [X] = 0。
    q.push(X)。
    しばらく(!q.empty()){ 
        int型は今= q.front(); 
        q.pop(); 
        {(; I I = E [i]は.next I =のLS [今] INT)のための
            IF(DIS [今] + E [I] .W <DIS [E [i]の.TO]){ 
                DIS [E [I] .TO] = DIS [今] + E [I] .W。
                IF(B [E [i]は.TO]!){ 
                    q.push(E [I] .TO)。
                    B [E [i]は.TO] = 1。
                } 
            } 
        } 
        B [今] = 0; 
    } 
    CNT ++。
    以下のために(INT i = 1; iが<= K + 1; I ++){ 
        IF(CNT = I!){ 
			D [CNT] [I] =のDIS [SPE [I]]。
		} 
	} 
    D [CNT] [K + 2] = DIS [T]。
} 

ボイドDFS(INTのDEP、長い長い和、int型DC){ 
    IF(和+ D [DC] [K + 2]> ANS){ 
		返します。
		} 
    IF(DEP> = K + 1){ 
        IF(和+ D [DC] [K + 2] <ANS){ 
			ANS =和+ D [DC] [K + 2]。
		} 
        を返します。
    } 
    ため(INT I = 2、iは<= K + 1; I ++){ 
        もし{(V [I]!)
            V [I] = 1。
            DFS(DEP + 1、和+ D [DC] [i]は、I)。
            V [I] = 0;
        } 
    } 
} 
 
{)(メインINT 
	)(N =読み取ります。
	、M =(読み取り)
	K =リード()。
	S =)は(読み取り、
	T =読み取ります(); 
    以下のために(INT I = 1; I <= M; iは++){ 
        int型のX、Y、Z。
        X =リード()。
        Y =読み取り(); 
        Z =リード()。
        (x、y、z)を加えます。
    } 
    ため(INT I = 2、iは<= K + 1; I ++){ 
    	SPE [i]が()読み取ります。=。
    } 
    SPE [1] = sで、
    以下のために(INT i = 1; iが<= K + 1; I ++){ 
        spfa(SPE [I])。
    } 
    ANS = Q。
    DFS(1,0、S)。
    IF(ANS <Q){ 
		のprintf( "%のLLD"、ANS)。
	} 
    他{ 
		のprintf( " - 1")。
	} 
}

  

おすすめ

転載: www.cnblogs.com/hahaha2124652975/p/11351216.html