説明
N都市、0からN-1、Mの道路番号、道路長物品K(Kは、0から始まる)が2 ^ Kであるが、都市0最短距離に他の都市を求める番号。
入力
2つの正の整数N(2 <= N <=の最初の行 100)、M(M <= 500)は、 N個の都市を発現し、道路M、
次の二つの行の整数M、接続された二つの都市を表します番号。
出力
達していない場合は、行N-1、都市に0の数を表す最短他の都市は、-1の出力は、結果値が出力MOD 100,000大きすぎます。
参考リンク:1956 C最短経路問題
次のように最終的なACコードがあります:
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 CONST INT MAX = 105、INF = - 1 。 int型の父[MAX]、D [MAX] [MAX]; INT findFather(INT X){ // 找父节点 場合(X ==父[X])戻りX。 他の リターンfindFather(父[X]); } INT quickMi(int型 A、int型 K、int型MOD){ int型 ANS = 1 。 長い 長い int型のres = A; 一方、(K){ IF(K&1。)ANS =(ANS * RES)%MOD; RES =(RES *はRES)%MOD; // ここで書かれていません= RES(RES * A)のMOD%; K = >> 。1 ; } リターンANS; } int型のmain(){ int型I、J、K、U、V、X、Y、N-、M、DIS、 一方(scanfの(" %D%D "!&N-、&M)= EOF){ 塗りつぶし(D [ 0 ]、D [ 0 ] + * MAX MAX、INF); // 初期化アレイ距離 のためには、式(I = 0、I <N - 、I ++){ 父[I] I =; // 初期化互いに素なセット D [I] [I] = 0 ; // 初期化配列の対角距離は、ここで間違った答えを忘れなければならない } のために(K = 0 ; K <M、K ++ ){ scanf関数(" %D%D "、&U&V); X = findFather(U); Y = findFather(V); IF(!X = Y){ // 命令Uを、Vが接続されていない DIS = quickMi(2、K、100000); // インデックスがフラッシュ多くの電力を使用しているので ため(I = 0; I <N-; I ++ ){ IF(x == findFather(I)){ // ルートノードとしてのXセット上の全ての点を見つける ため(J = 0 ; J <N-; J ++ ){ IF(Y == findFather(J)){ //はルートノードのYとしてセット内のすべてのポイントを見つける D [i]は[J] = D [j]は[I] =(D [i]が[U] + DIS + D [V] [J])%100000 ; // 更新 } } } } 父[Y] = X; // 2つのコレクションマージ } } ため(J =を1; J <N; J ++)のprintf(" %D \ n "、D [ 0 ] [J])。 } 戻り 0 。 }
概要:重要な問題は、それが最も短絡のための半分の方法では解決できないので、このトラブルのインデックスは、大きくなる可能性があります。その後、高速な剰余の力で大きな状況の指数パワーを解決する方法を模索して。そして、剰余保存後のパス、などして、ダイクストラの最短経路を試し、結果はまだWAです。その後、高速パワーを持つ人々+とは、セットを解決するために非常に簡単な方法を確認することが判明したときに参照する他の人のブログには、主なアイデアは、ある2つのポイントがコレクションに既にある場合は、バックの入力側が増加しているので、そうもはや更新され、二つの異なるコレクションに2つの点が、その縁部が二組、更新経路のアレイ、及び次いで合わせたセットに接続されていない場合。