[2176] Л Гу контрольно-пропускной пункт

Название Описание

Каждое утро, FJ из своих домов по всей ферме пошел в КПЗ. Сельскохозяйственные фермы, состоящие из N блоков, М соединены двунаправленной ферма дороги, каждая дорога имеет определенную длину. FJ дома № 1 поле, номер поле Н в корову. Два поля не связаны с множеством дорог соответствующего путем для любой пары последовательности всегда ходить на поле фермы. Когда другая часть, когда FJ пришел с поля, всегда с общей длиной пути кратчайшего пути идти порядок.

FJ скота делают, всегда недоброжелателей, она решила помешать его планам каждое утро. Они помещаются в стек из соломы на дороге М, так что удвоение длины дороги. Крупный рогатый скот надеется, что вы следовать интерференция пути делает FJ дорогу от дома до самого большого увеличения КПЗА долго. Они просят вас разработать и сказать им, насколько максимальный прирост.

Формат ввода

Строка 1: два целых числа N, М.

2 через M + 1: Линия + 1 строка содержит три целых числа A_i, B_i, l_i, A_i и B_i я представляет собой число полей дорожной связи, L_i представляет собой длину пути.

Формат вывода

Строка 1: Целое число, представляющее максимальный прирост за счет удвоения маршрута, полученного.

Пример ввода и вывода

Input # 1
5 7 
2 1 5 
1 3 1 
3 2 8 
3 5 7 
3 4 3 
2 4 7 
4 5 2
Выход # 1
2

Описание / Советы

[Пример Описание]

Ruoshi дороги между 3 и 4 длиной в два раза по кратчайшему пути, становится 1-3-4-5 1-3-5.

[Данные] масштаб и условные

Для получения 30% данных, N <= 70, М <= 1500.

К 100% данных, 1 <= N <= 100,1 <= М <= 5,000,1 <= L_i <= 1000000.

 

 

Решение: Последний пункт TLE, извлекающий орган может жить, и счастливым.

          Обыкновенное SPFA плюс небольшое моделирование на нем о

 

# include <cstdio> 
#include <CMATH> 
#include <CString> 
#include <cstdlib> 
#include <iostream> 
#include <алгоритм> 
#include <очереди>
 с использованием  пространства имен станд;
Const  INT N = 10001 ;
INT х, п, т, U, V, ZZ, CNT, ANS;
ИНТ дис [N], глава [N], по отношению [N];
структура узла {
     INT вал;
    ИНТ рядом;
    Int к; 
} е [Н]; 

недействительными добавить ( INT х, INT у, INT г) {
    е [ ++ CNT] .to = у; 
    е [CNT] .val = г; 
    е [CNT] .next = напор [х]; 
    Голова [х] = CNT; 
} 
Очереди < INT > д;
INT SPFA () { 
    MemSet (дис, 0x3f , SizeOf (дис)); 
    MemSet (Vis, 0 , SizeOf (VIS)); 
    Vis [ 1 ] = 1 ; дис [ 1 ] = 0 ; q.push ( 1 );
    в то время как (! q.empty ()) { 
        х = q.front ();
        q.pop (); по отношению [х] = 0 ;
        для ( Int я = головы [х];! я = 0 , я = е [я] .next) { 
            V = е [я] .чтобы;
            если (е [I] .val + дис [х] < дис [v]) { 
                дис [v] = е [I] .val + дис [х];
                если ( по отношению [v] == 0 ) {отношению [v] = 1 ; q.push (v); } 
            } 
        } 
    } 
    Вернуться дис [N]; 
} 

INT основных () { 
    зсапЕ ( " % d% d " , & п, &м);
    за( Int I = 1 ; я <= т; я ++ ) { 
        зсапЕ ( " % D% d% d " , & и, & V, & ZZ); 
        Добавить (U, V, ZZ); Добавить (V, U, ZZ); 
    } 
    INT qwq = SPFA ();
    для ( INT I = 1 ; я <= т; я ++ ) { 
        е [я * 2 ] .val * = 2 ; 
        е [я * 2 - 1 ] .val * = 2 ;
        INT JJJ = SPFA (); 
        ANS = макс (JJJ, ANS);
        //соиЬ << анс << епсИ; 
        е [я * 2 ] .val / = 2 ; 
        е [я * 2 - 1 ] .val / = 2 ; 
    } 
    Е ( " % d \ п " , ans- qwq);
    вернуться  0 ; 
}

Ha (тайно прикрепить оптимизированную версию, но не те 90 баллов ...... никто не должен видеть)

# include <cstdio> 
#include <CMATH> 
#include <CString> 
#include <cstdlib> 
#include <iostream> 
#include <алгоритм> 
#include <очереди>
 с использованием  пространства имен станд;
Const  INT N = 10001 ;
INT х, п, т, U, V, ZZ, CNT, ANS;
ИНТ дис [N], глава [N], по отношению [N]; 

структура узла {
     INT вал;
    ИНТ рядом;
    Int к; 
} е [Н]; 

недействительными добавить ( INT х, INT у, INT г) {
    е [ q.empty ()) {++ CNT] .to = у; 
    е [CNT] .val = г; 
    е [CNT] .next = напор [х]; 
    Голова [х] = CNT; 
} 

Очереди < INT > д;
INT предварительно [N], FR [Н], ро, МИО [N], NU; 

INT SPFA () { 
    MemSet (дис, 0x3f , SizeOf (дис)); 
    MemSet (Vis, 0 , SizeOf (VIS)); 
    Vis [ 1 ] = 1 ; дис [ 1 ] = 0 ; q.push ( 1 );
    в то время как (! 
        х = q.front (); 
        q.pop (); по отношению [х] = 0 ;
        для ( INT I = головы [х]; I; I = е [I] .next) { 
            v = е [я] .to;
            если (е [I] .val + дис [х] < дис [v]) { 
                дис [v] = е [I] .val + дис [х]; 
                предварительно [v] = I; Fr [V] = х; // *** 
                если (! Визави [v]) {визави [v] = 1 ; q.push (v); } 
            } 
        } 
    } 
    Вернуться дис [N]; 
} 

INT основных () { 
    freopen ( " 2176.in " ," Г " , STDIN); 
    freopen ( " 2176.out " , " ш " , стандартный вывод); 
    зсапЕ ( " % d% d " , & п, & м);
    для ( INT I = 1 ; я <= т; я ++ ) { 
        зсапЕ ( " % d% d% d " , & и, & v, & ZZ); 
        Добавить (U, V, ZZ); Добавить (V, U, ZZ); 
    } 
    
    INT qwq = SPFA ();
    INT Теперь = п;
    в то время как (сейчас++ Nu] = предварительно [теперь];  % d \ п// 记路径 
        Теперь = фр [теперь]; 
    } 
    
    Для ( INT I = 1 ; я <= Nu; я ++ ) { 
        е . [МИО [I]] Val * = 2 ; 
        е [МИО [я] ^ 1 ] .val * = 2 ;
        INT JJJ = SPFA (); 
        ANS = макс (JJJ, ANS);
        // соиЬ << анс << епсИ; 
        е [МИО [I]] Val / =. 2 ; 
        е [МИО [я] ^ 1 ] .val / = 2 ; 
    } 
    Е ( "" , Ans- qwq);
    вернуться  0 ; 
}

 

рекомендация

отwww.cnblogs.com/wuhu-JJJ/p/11680339.html