店舗への少なくとも1つのトラックの存在を確実にするために、入力ライン。
波にhttp://acm.hdu.edu.cn/showproblem.php?pid=2544のコード
#include <ビット/ STDC ++。H> の#include <iostreamの> する#include <アルゴリズム> の#include <cstdioを> する#include < ストリング > の#include <CStringの> する#include <cstdlib> の#include <地図> の#include <ベクトル> #含める < セット > の#include <キュー> の#include <スタック> の#include <cmath> typedefの長い 長いLL。 使用して 名前空間はstdを、 const int型 INT = 1E6 + 5 。 LSONのRT << 1、L、M の#define rsonのRT << 1 | 1、M + 1、R用 の#define読み取る(X)のscanf( "%dの"、およびX) の#define LREAD(X)のscanf( "%のLLD "、&バツ); #define PT(X)のprintf( "%d個の\ n"、(X)) の#define CN CIN >> の#define CT COUT << の#define EN << ENDL の#define担当者(J、K)のための式(I = int型(INT)〜(j)は、iが<=(INT)(K); I ++) の#define MEM(S、T)のmemset(S、T、はsizeof(複数可)) の#defineリターン0を再。 文字列 STR1 = " CC "、STR2 = " PC "、STR3 = " PP "" ; INT DP [ 101 ] [ 101 ]、DIS [ 101 ]、使用[ 101 ]; int型M、N、X、Y、Z、 無効Dijstraを() { MEM(使用、0 ); 担当者(1、N) DIS [i]はDP [= 1 ] [I]; // 距离初始化 DIS [ 1 ] = 0 ; 担当者(1 、N) { int型のインデックス、mindis = INT; のために(INT J = 1 ; J <= N。 J ++ ) { 場合(!使用[J] && DIS [J] < mindis) { インデックス = J。 mindis = DIS [J]。 } } [インデックス]を用い = 1 。 用(INTの J = 1 ; J <= nであり、j ++ ) { 場合(DIS [インデックス] + DP [インデックス] [J] < DIS [J]) DIS [J] = DIS [インデックス] + DP [インデックス] [ J]; } } CT DIS [n]のアン。 } ボイドのinit() { 一方(CIN >> N >> M &&(N && M)) // N-M点縁 { IF(N - == 1){CT 0 EN; 続行;} // 重量は、初期最大化 するために(INT I = 1 ; I <= N-I ++ ) のための(INT J = 。1 ; J <= N; J ++ ) DP [I] [J]は、 = INTを; // 重量初期 REP(1 、M) { CIN >> X >> Y Z; IF(DP [X] [Y ]> Z) DP [X] [Y]= DP [Y] [X] = Z; } Dijstra()。 / * 担当者(1、N) のための(INT J = 1; J <= N; J ++) DP [I] [j]はDP [J] [I] = I ^ jは=。 * / } } int型のmain() { INIT()。 }
-----------------------------------------------セパレータ - ---------------------------------------
最短は、データ範囲に注意を払うとのポイントを最適化する必要があります(追加)
1.floydアルゴリズム一般的に使用される単語隣接行列演算(すぎない行列初期化データ)
2.dijkstraアルゴリズムは、その後一緒にヒープを最適化し、それはプライオリティキューです(ヒーププラスマップ場合は、削除操作がより速くなるでしょう増加)
(もしあれば)n個の点を有するように適合され、図Mのエッジは、始点Sが与えられると、最短経路は、互いの到達点を決定することができます
3.SPFAアルゴリズムは、嵐に力全体の検索緩和、良い心を最適化BE、本質的には、非常に高速書き込みます。利用できません発散ビューのトレリス線図など
-----------------------------------------------セパレータ - ---------------------------------------
Dijstra一般的な考え方は、アルゴリズムを使用することです:
1)主な役割を最大化するために(パスを最大にする)、存在しない道路の一部をスクリーニングすることです
2)パス入力の存在は、初期化し、すべての未訪問の点光源と直接距離(各点にDIS貯蔵源)のDIS []配列記憶された各点までの距離を
Dijstraのコアコード
3)一点判定ずつ、各点光源からの最短距離を見つけ、そしてポイントの状態を更新します
4)!!!(黒板にノック)
もし(DIS [インデックス] + DP [インデックス] [J] < DIS [J]) DIS [J] = DIS [インデックス] + DP [インデックス] [J]。
最短距離を更新
上記の手順と併せて以下の図は、よりよく理解されるであろう(ブーイング!!!の図は、他の誰かのではなく、静かです)
1)エッジの重量に対して
2)最適化スタック
店舗への少なくとも1つのトラックの存在を確実にするために、入力ライン。