CF843Dダイナミック最短経路spfa +剪定

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を返します。 
}

  

おすすめ

転載: www.cnblogs.com/guangheli/p/11776502.html