Wycieczki線形代数

B.ツアー

タイトル説明

有向グラフ重み付け縁M n個の点を考慮すると、右側の各エッジは、1つだけの、2であってもよいです、。
すべての可能な経路は、ソートの経路長に応じて、K小パスの出力長は、パスは、必ずしも同じ点を繰り返し取ることができる簡単なメモパスではありませんしてください。

入力形式

最初の行は、n 3つの整数を含む、M、K(1 < = N <= 40,1 <= M <= 1000,1 <= K <= 10 ^ 18)。
三つの整数の次のm行は、Uは、V、C(1 < = U、V <= N、UはVに等しくない場合、1 <= C <= 3) におけるVへの単一のUから発現しました辺の長さをC側。
複数のエッジがあるかもしれません。

出力フォーマット

線は正の整数、k番目のパスの即ち短い長さが含まれ、そうでない場合、出力-1。

サンプル

サンプル入力

6 6 11
1 2 1
2 3 2
3 4 2
4 5 1
5 3 1
4 6 3

サンプル出力

4

データ範囲とヒント

1のパスの長さは1> 2,5> 3,4> 5です。
経路2の長さは2> 3,3> 4,4> 5-> 3です。
経路3の長さは4> 6,1-> 2-> 3,3> 4-> 5,5> 3-> 4。
図4は、経路5-> 3-> 4-> 5の長さを有します。

この質問は、主にチューニングが難しいこの質問泥棒の、わずかなミスがWA意志、そして泥棒よりも多くのテストポイントの問題を解決する、ケースに2つの以上のポイントが存在しますので、私は本当に、時間の比較的長いスパンであります前記署名、コードXの一部にティーバッグ紙コップ、

実際には、この質問はかなりいるようだが、また、思考の量、主なポイントは、分割されたマトリックスの側面を取り、その後、建設側、ポイントに注意を払う必要があることです、つまり、全体の行列は3倍に拡大されます。実際には、全体の問題は、(私は半分を二点ヒットしました、、本当に遅い実行されている方法のために)、とにかく、私は構造を使用していた、私はベンが再生されているか、他の神々がわからない、倍増、と同じ、行列に置き換えられている需要のLCA事実に倍増しかし、細部に注意を払う、夜のためのカード全体は、それがマトリックス質量の参加がアドレスを取るために増加していなかったためで、プラスに、ベンはメッセージを残すだろう、なぜ神は知っています

#include <cstdioを> 
する#include <CStringの> 
する#include <cmath> 
の#include <iostreamの>
 使用して 名前空間STD。
#defineは長い長いLL
 の#define再登録
 の#define(iは++; iは= bを<LL iは=)F(iは、、B)のためには、
N、M、U、V、D、T LL。
長い 長いS、K。
ブールフラグ。
インラインLLリード()
{ 
    LL SSを再 = 0チャー BB = GETCHAR()。
    一方、(BB < 48 || BB> 57)BB = GETCHAR()。
    一方、(BB> = 48&& BB <= 57)SS =(SS << 1)+(SS << 3)+(B-B ^ 48)、BB = GETCHAR()。
    リターンSS。
} 
構造体Martix 
{ 
    LL X [ 250 ] [ 250 ]。
    無効INITを()
    { 
        memsetの(X、0はsizeof (X)); 
    } 
} MUL [ 125 ]、TMP。
Martix BG、ベース今、;
ボイド(Martix&、Martix&B、Martix&製C)
{ 
    フラグ = 1 
    tmp.init();
    F(I、13 * N + 1 
        F(L、13 * N + 1 
        { 
            場合(AX [I] [L]!)続けます// デバッグ(I);デバッグ(リットル); 
            F(J、13 * N + 1 
                tmp.x [I] [J] = tmp.x [I] [J] + AX [i]は[L] * BX [L] [J]。
            もし(Iの== 1 && tmp.x [I] [ 3 * N + 1 ]> = K)フラグ= 0 
        } 
    C = TMP。
} 
int型のmain()
{ 
    // freopenは( "cnm.txt"、 "R"、STDIN)。
    N =読み取る()、M =(読み取り)、K = 読み取ります(); 
    F(I、1 、N)
    { 
        bg.x [ 1 ] [I] = 1 ベース .X [I] [iがN +] = 1 ベース .X [iがN +] [iが+ 2 ×n個] = 1 
    } 
    一方(M-- 
    { 
        Uは読み取り=()、V =読み取る()、D = 読み取ります();
        ベース .X [U +(D- 1)* N] [V] ++ ;
        ベース .X [U +(D- 1)* n]は[ 3* N + 1 ] ++ ; 
    } 
    基部 .X [ 3 * N + 1 ] [ 3 * N + 1 ] = 1 
    MUL [ 0 ] = 塩基;
    (; T <= 63、T ++ 
    {     
        場合(T)
            からなる(MUL [T - 1 ]、MUL [T- 1 ]、MUL [T])。
        (BG、MUL [T]、今)からなります。
        もし(!フラグ|| now.x [ 1 ] [ 3 * N + 1 ]> = K){ 破る;}  
    }
    T -;
    もし(T == 63 && now.x [ 1 ] [ 3 * N + 1 ] < K)
    { 
        プット(" -1 " )。
        リターン 0 ; 
    } 
    のための(LL I = tの; I> = 0 ; i-- 
    { 
        作ら(BG、MUL [i]は、今)。
        もし(フラグ&& now.x [ 1 ] [ 3 * N + 1 ] < K)
        { 
            S + =(1LL << I)。
            BG = 今; 
        }
    } 
    のprintf(" %のLLDを\ n "、S + 1 )。
}
HHH

endl;

 

おすすめ

転載: www.cnblogs.com/hzoi-lsc/p/11209856.html