各$(X、Y、W)$のために、偶数(W X-1、Y)$エッジ、(Y、X-1、-w)$は、$ yは$の$よりか月前前利益を表しますX-1の大きなゲインの$ W $の$ヶ月
そのような被験体は、図1の変換があるか否かを尋ねられた非ゼロリング存在します
だから我々はうまく肯定リング(最長経路)と負のループ(最短)を探してください
実際には、あなたは同等で、正と負のループリングを見つけます
だから、あなただけの1行に1つを必要とします
書式#include <iostreamの> の#include <cstdioを> する#include <CStringの> 使用して 名前空間はstd; #define N 105 INT T、N、M、[N] [N]、F1 [N]、F2 [N]、INF。 BOOL VIS1 [N]、VIS2 [N]、[OK]。 ボイド spfa1(INT X){ 場合(VIS1 [X])OK = 1 。 もし(OK)のリターン; VIS1 [X] = 1 。 以下のための(int型私は= 0 ; I <= N && OK!++ I) の場合(![X] [i]を= INF) の場合、F1 [X] +(F1 [I]>[X] [i])と F1 [I] = F1 [X] + [X] [i]は、spfa1(I)。 VIS1 [X] = 0 ; } ボイド spfa2(INT X){ 場合(VIS2 [X])OK = 1 。 もし(OK)のリターン; VIS2 [X] = 1 。 以下のための(int型私は= 0 ++; [OK]を私は<= N &&!i)が あれば([X] [i]を=!infファイル) の場合(F2 [i]は、<F2 [X] + [I] [X] ) F2 [I] = F2 [X] + [X] [i]は、spfa2(I)。 VIS2 [X] =0 ; } int型のmain(){ scanf関数(" %のD "、&T)。 一方、(T-- ){ memsetの(、127、はsizeof(a)参照)。INF = [ 0 ] [ 0 ]。 memsetの(F1、127、はsizeof (F1))。 memset(F2、128、はsizeof (F2))。 scanf関数(" %d個の%のD "、&N、&M)。OK = 0 ; F1 [ 0 ] = F2 [ 0 ] = 0 。 以下のための(int型 I = 1、U、V、W; I <= M; ++ I){ scanf関数(" %D%D%D "、&U&V、およびW) [U - 1 ] [V] = Wは、 [V] [U - 1 ] = - W。 } のために(int型私= 0 ++;;私は= <nでspfa1(I)、spfa2(I)は、i); //自选一种 プット(OK?" 偽":" 真" ); } 戻り 0 。 }