T3の検査は、暴力+剪定カードを引き継ぎます。
私は〜CFが行く可能性が期待していませんでした
コード:
#include <ビット/ STDC ++。H> #define N 100004 #define LL長い長いです #define INF 1000000000000000 名前空間stdを使用。 INT行く[N]; 名前空間IO { するchar * P1、P2 *、BUF [100000]。 #define NC()(P1、P2 == &&(P2 =(P1 = BUF)+関数fread(BUF、1、100000、STDIN)、P1 == P2)EOF:* P1 ++) インラインint型RD(){ INT X = 0。 チャーC = NC()。 一方、(C <48){ C = NC()。 } 一方、(C> 47){ X =(((X << 2)+ X)<< 1)+(C ^ 48)、C = NC()。 } Xを返します。 } インライン無効setIO(文字列s) { 「インチ」= S +の文字列。 文字列アウト= sの+ "アウト。"; freopenは(in.c_str()、 "R"、STDIN)。 freopenは(out.c_str()、 "W"、STDOUT)。 } }。 LLのD [N]。 ベクター<INT> G [N]。 INTのN、Mは、Qは、INQ [N]、[N]に行わ。 構造体のエッジ { LLのval; あなたと、V。 } [N]のうち。 そして<整数> N; ボイドダイクストラ() { D [I] = INF、[I] = 0 INQ(; iが<= N I ++ iは1 = INT)のために、 D [1] = 0、INQ [1] = 1。 q.push_back(1)。 しばらく(!q.empty()) { INT U = q.front()。q.pop_front(); 以下のために(INT I = G [U] .size() - 1; I> = 0; - I) { エッジe = EE [G [U] [I]]。 [EU] = 0 INQ。 IF(D [EV]> D [U] + e.val) { D [EV] = D [U] + e.val。 (もし!INQ [EV]) { IF(q.empty()|| D [EV] <D [q.front()])q.push_front(EV)。 他q.push_back(EV); INQ [EV] = 1。 } } } } } メインint型() { // int型のT =クロック(); // IO :: setIO( "入力"); int型I、J、フラグ= 1; N = IO :: RD()。 M = IO :: RD()。 Q = IO :: RD(); //のscanf( "%D%D%D"、&N、&M&Q)。 用(i = 1; I <= M; ++ I) { [I] .U = IO :: RD()EE。 [I] .V = IO :: RD()EE。 EE [I] .val = IO :: RD()。 G [EE [I] .U] .push_back(I)。 } ダイクストラ(); 用(i = 1; iは= N <; ++ i)から(D [i]を== INF)は行けば、[I] = 0; 他に行く[I] = 1; 以下のための(I = 1; I <= Q; ++ I) { int型OPT、頁; OPT = IO :: RD(); PP = IO :: RD(); // scanf関数( "%d個の%d個"、&選ぶ、&頁)。 もし(OPT == 2) { 用(J = 1; J <=頁; ++ j)は { INT X = IO :: RD()。 ++ EE [X] .val。 } フラグ= 0。 } 他 { (![PP]を行く)の場合 { printf( " - 1のn \"); } 他 { (もし!フラグ) { フラグ= 1。 ダイクストラ(); } printf( "%LLDする\ n"、D [PP])。 } } } //のprintf( "%d個の\ n"、クロック() - T)。 0を返します。 }