Submission #04502
ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | #include<bits/stdc++.h> #define REP(i, n) for(int i = 0; i < (n); i++) #define pb(a) push_back(a) #define INF INT_MAX #define fr first #define sc second using namespace std; typedef pair< int , int > P; vector<P> v[100001]; int dij( int s, int g){ // priority_queueを使うことで、O(N*logN)になる。 // 以下のように宣言することで、(pair).first が小さい順で自動的にソートされる。 // 降順の時はvectorとgreaterはいらない priority_queue<P, vector<P>, greater<P> > que; // 「ノードiにたどり着いた」というのを確定させる必要がある。 bool used[100001] = {0}; que.push(P(0, s)); // コスト(距離の小さい順) でソートしたいので、(pair).firstの値がコストになるように。 while (!que.empty()){ // 基本的にはqueueが空になれば全てのパターンを列挙したことになる。 P p = que.top(); que.pop(); int cost = p.fr, now = p.sc; used[now] = 1; if (now == g) return cost; // 今回のように、「ゴールに最初についた時のコスト」だけが必要な時はこれでいい。臨機応変に。 REP(i, v[now].size()){ // 現在ノードから繋がっている道の数だけ見てみる。 int next_cost = cost + v[now][i].fr, next = v[now][i].sc; // 今回の場合は、既にnextのノードに行き着いている際はとっくにノードnextまでの最小は求まっている。 // なので以下のようにまだ行き着いていないノードにのみ行けばよい。 if (!used[next]) que.push(P(next_cost, next)); } } return INF; } int main(){ int N, M; cin >> N >> M; REP(i, M){ // 経路数が一様である int a, b, c; cin >> a >> b >> c; a--; b--; // 0からN-1のノードまで v[b].pb(P(c, a)); // ノードbからノードaまでコストがcだけかかる、というようなイメージ。 v[a].pb(P(c, b)); // 道が双方向に移動できる時はaとbを逆にして追加していく。 } int ans = dij(0, N-1); if (ans == INF) cout << "NA" << endl; else cout << ans << endl; } // なお、今回はpair型で求めていたが、臨機応変にできるのは構造体。 // priority_queueを使用する際何を基準にソートするかということを決める必要が出てくるが(ぐぐって、どうぞ) |
ステータス
項目 | データ |
---|---|
問題 | 0431 - 君も始めようダイクストラ大好き厨 |
ユーザー名 | ei1409 |
投稿日時 | 2016-06-06 18:41:48 |
言語 | C++11 |
状態 | Accepted |
得点 | 1 |
ソースコード長 | 2455 Byte |
最大実行時間 | 125 ms |
最大メモリ使用量 | 7380 KB |
セット
セット | 得点 | Cases | |
---|---|---|---|
1 | ALL | 1 / 1 | * |
テストケース
ファイル名 | 状態 | 実行時間 | メモリ使用量 | # |
---|---|---|---|---|
m_in1.txt | AC | 125 ms | 7380 KB |
1
|
r_in1.txt | AC | 25 ms | 3804 KB |
1
|
r_in2.txt | AC | 30 ms | 4176 KB |
1
|
r_in3.txt | AC | 32 ms | 4160 KB |
1
|
r_in4.txt | AC | 21 ms | 3592 KB |
1
|
r_in5.txt | AC | 37 ms | 4308 KB |
1
|
r_in6.txt | AC | 44 ms | 4032 KB |
1
|
r_in7.txt | AC | 24 ms | 3484 KB |
1
|
r_in8.txt | AC | 31 ms | 3548 KB |
1
|
r_in9.txt | AC | 34 ms | 4040 KB |
1
|
r_in10.txt | AC | 19 ms | 3176 KB |
1
|
r_in11.txt | AC | 26 ms | 3744 KB |
1
|
r_in12.txt | AC | 26 ms | 3704 KB |
1
|
r_in13.txt | AC | 31 ms | 3996 KB |
1
|
r_in14.txt | AC | 31 ms | 4220 KB |
1
|
r_in15.txt | AC | 30 ms | 4280 KB |
1
|
r_in16.txt | AC | 23 ms | 3532 KB |
1
|
r_in17.txt | AC | 23 ms | 3472 KB |
1
|
r_in18.txt | AC | 24 ms | 3616 KB |
1
|
r_in19.txt | AC | 19 ms | 3584 KB |
1
|
r_in20.txt | AC | 21 ms | 3604 KB |
1
|
r_in21.txt | AC | 15 ms | 3292 KB |
1
|
r_in22.txt | AC | 18 ms | 3380 KB |
1
|
r_in23.txt | AC | 20 ms | 3484 KB |
1
|
r_in24.txt | AC | 20 ms | 3660 KB |
1
|
r_in25.txt | AC | 25 ms | 3688 KB |
1
|
r_in26.txt | AC | 23 ms | 3640 KB |
1
|
r_in27.txt | AC | 25 ms | 3736 KB |
1
|
r_in28.txt | AC | 24 ms | 3844 KB |
1
|
r_in29.txt | AC | 25 ms | 4048 KB |
1
|
r_in30.txt | AC | 31 ms | 4024 KB |
1
|