次の日
A1003緊急(25分)
タイトル内容
市の緊急救助チームのリーダーとして、あなたはあなたの国の特別なマップを与えられています。マップは、いくつかの道路で接続された複数の散乱都市を示しています。各都市と都市の任意のペア間の各道路の長さは救助隊の量は、地図上にマークされています。いくつかの他の都市からあなたへの緊急呼び出しがあった場合、あなたの仕事は、可能な限り迅速な場所にあなたの男性をリードしており、平均時間で、可能な限りの方法でできるだけ多くの手を呼び出します。
入力仕様:
各入力ファイルには、1つのテストケースが含まれています。各テストケースのために、最初の行が4つの正の整数含ま:Nを(≤500) -都市の数、M(及び都市が0からN-1まで番号付けされる) -道路の数、C 1及びC 2 -現在では、あなたは、それぞれ、保存しなければならないことにある都市。次の行は、i番目の整数はi番目の都市における救助隊の数であるN個の整数を、含まれています。次いで、M線はそれぞれ3つの整数Cと道路を説明し、従う1、C 2はそれぞれ道路とその道路の長さによって接続都市の対であり、L、。Cから少なくとも1つの経路が存在することが保証される1 ℃に2。
出力仕様:
Cの間で異なる最短経路の数:各テストケースのために、一列二つの数字で印刷1及びC 2、そしてあなたはおそらく収集できる救助隊の最大量。行のすべての数字は正確に一つのスペースで区切らなければならず、行の末尾に許さ余分なスペースがありません。
サンプル入力:
5 6 0 2
1 2 1 5 3
0 1 1
0 2 2
0 3 1
1 2 1
2 4 1
3 4 1
サンプル出力:
2 4
単語
緊急
英/ɪmɜdʒ(G)nsɪ/美/ɪmɝdʒənsi/
nは緊急;.緊急事態、非常にモーメント
ADJ緊急;.スタンバイ
救援
英語/ 'reskjuː/ US /' rɛskju/
。Nレスキュー、救助、救助、救出運転
損失を防ぐために(非公式)......; Vの救出、救助
散乱
英語/ 'skætəd/米国/' skætɚd/
ADJ分散;散乱します
その時間で
同時に、
呼び出します
招集;呼び出しそう思う。提案
できるだけ多くの手
多くのマンパワーとして、
保証
英/ Gaer(A)NTI /美/ɡærənti/
。nは保証;保証;保証人、保証、担保
。VTの保証を、保証
トピック分析
このタイトルは、ポイントにダイクストラのアルゴリズムを解決することができます使用して、通常の単一ソース最短経路問題ですが、リフレッシュあなたはNUMを更新する必要がある道のDIST(最短経路のすべてのポイントに到達)(ほとんどの短絡の数)と救助(救助隊の数)数、NUM上の最短の数が、私は、実際には、最短経路上のピースの数を最後に到達したときにショートバーを監視するために、整数変数の唯一の最小数を使用して、比較的簡単だと思うようになりました常に最終的な結果を得るためにリフレッシュする必要性のような最短の長さと救助チームの数。
特定のコード
#含む&ltstdio.h> #が含ま&ltstdlib.h> #含める&ltlimits.h> の#define MAXSIZE 500 INT道路[MAXSIZE] [MAXSIZE]。 int型のチーム[MAXSIZE]; int型の救出[MAXSIZE]; int型is_collect [MAXSIZE]; [MAXSIZE] is_visited intです。 int型のDIST [MAXSIZE]; int型NUM [MAXSIZE]; 整数N、M、C1、C2。 ダイクストラ()を無効に。 INTメイン(ボイド) { scanf関数( "%D%D%D%D"、&N、&M、&C1、およびC2)。 以下のために(INT i = 0; iがNを<; I ++)は scanf関数を( "%d個"、&チーム[I])。 以下のために(INT i = 0; iがNを<; iは++) { DIST [I] = INT_MAX。 } ため(INT i = 0; iがMを<; iは++) { scanf関数( "%D%D%D"、&C1、およびC2、&L)。 道路[C1] [C2] = L。 道路[C2] [C1] = L。 } ダイクストラ()。 printf( "%d個の%のD"、NUM [C2]、レスキュー[C2])。 システム(「一時停止」)。 } INT is_trave() { int型フラグ= 1。 以下のために(INT i = 0; iがNを<; iは++) { (is_visited [I] = 0 && is_collect [I] == 0!)場合 { フラグ= 0。 ブレーク; } } フラグを返します。 } int型find_min() { int型温度= 0。 int型分= INT_MAX。 以下のために(INT i = 0; iがNを<; iは++) { IF(is_visited [I] == 1 && is_collect [I] == 0) { IF(DIST [I] <分) { 分= DIST [I]。 温度= I; } } } 戻りTEMP。 } ボイドダイクストラ() { is_collect [C1]は= 1。 救出[C1] =チーム[C1]。 NUM [C1] = 1。 以下のために(INT i = 0; iがNを<; iは++) { (!道路[C1]は[I] = 0)場合 { is_visited [I] = 1。 DIST [I] =道路[C1] [I]。 NUM [I] = NUM [C1]。 救出[I] =救出[C1] +チーム[i]は、 } } ながら(!is_trave()) { int型、M = find_min()。 is_collect [M] = 1。 以下のために(; iがNを<I ++はI = 0 INT) { IF(!道路[M] [I] = 0 && is_collect [I] == 0) { IF(DIST [M] +道路[M] [i]は<DISTを[I]) { NUM [I] = NUM [M]。 DIST [I] = DIST [M] +道路[M] [I]; レスキュー[I] =レスキュー[M] +チーム[I]。 } そうであれば(DIST [M] +道路[M] [I] == DIST [I]) { NUM [I] = NUM [I] + NUM [M]。 IF(レスキュー[M] +チーム[I]>レスキュー[i])と レスキュー[I] =レスキュー[M] +チーム[I]。 } [I] = 1 is_visited。 } } } }