Skip to content

Commit

Permalink
update
Browse files Browse the repository at this point in the history
  • Loading branch information
Reputeless committed Aug 6, 2022
1 parent d625117 commit 523cc2b
Show file tree
Hide file tree
Showing 3 changed files with 92 additions and 1 deletion.
1 change: 1 addition & 0 deletions 003.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
#include <iostream>
#include <vector>
#include <queue>
#include <utility> // std::pair
#include <algorithm> // std::max_element()
#include <iterator> // std::distance()

Expand Down
90 changes: 90 additions & 0 deletions 013.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
# 013 - Passing (★5)

## 解答

```cpp
#include <iostream>
#include <vector>
#include <utility> // std::pair
#include <queue> // std::priority_queue
#include <functional> // std::greater

// 辺の情報
struct Edge
{
// 行先
int to;

// コスト
int cost;
};
const long long INF = 1LL << 60;

// { 距離, 頂点 }
using Pair = std::pair<long long, int>;

// ダイクストラ法
void Dijkstra(const std::vector<std::vector<Edge>>& graph, int startIndex, std::vector<long long>& distances)
{
// 「現時点での最短距離, 頂点」の順に取り出す priority_queue
// デフォルトの priority_queue は降順に取り出すため std::greater を使う
std::priority_queue<Pair, std::vector<Pair>, std::greater<Pair>> pq;
pq.emplace((distances[startIndex] = 0), startIndex);

while (!pq.empty())
{
const auto[distance, from] = pq.top(); pq.pop();

// 最短距離でなければ処理しない
if (distances[from] < distance)
{
continue;
}

// 現在の頂点からの各辺について
for (auto& edge : graph[from])
{
// to までの新しい距離
const long long d = (distances[from] + edge.cost);

// d が現在の記録より小さければ更新 & pq に追加
if (d < distances[edge.to])
{
pq.emplace((distances[edge.to] = d), edge.to);
}
}
}
}

int main()
{
// N 個の街, M 本の道路
int N, M;
std::cin >> N >> M;

// N 頂点のグラフ
std::vector<std::vector<Edge>> graph(N);
for (int i = 0; i < M; ++i)
{
int A, B, C;
std::cin >> A >> B >> C;
--A; --B;
graph[A].push_back({ B, C });
graph[B].push_back({ A, C });
}

// 街[0] から各街への最短距離
std::vector<long long> distancesFrom1(N, INF);
Dijkstra(graph, 0, distancesFrom1);

// 街[N-1] から各街への最短距離
std::vector<long long> distancesFromN(N, INF);
Dijkstra(graph, (N - 1), distancesFromN);

// 街[i] を経由して街[N-1] まで移動するときにかかる時間の最小値
for (int i = 0; i < N; ++i)
{
std::cout << (distancesFrom1[i] + distancesFromN[i]) << '\n';
}
}
```
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ C++17 標準ライブラリの機能を優先して使い、競技プログラ
|問題|タイトル (解答コードへのリンク)|難易度|公式解説|キーワード (公式解説から引用)|
|:--:|--|:--:|:--:|--|
|006| | | | |
|013| | | | |
|[013](https://atcoder.jp/contests/typical90/tasks/typical90_m)|[Passing](./036.md)|★5|[👨‍🏫](https://raw.githubusercontent.com/E869120/kyopro_educational_90/main/editorial/013.jpg) / [📝](https://github.com/E869120/kyopro_educational_90/blob/main/sol/013.cpp)|各頂点への最短経路はダイクストラ|
|021| | | | |
|[029](https://atcoder.jp/contests/typical90/tasks/typical90_ac)|[Long Bricks](./029.md)|★5|(1) [👨‍🏫](https://raw.githubusercontent.com/E869120/kyopro_educational_90/main/editorial/029-01.jpg) / [📝](https://github.com/E869120/kyopro_educational_90/blob/main/sol/029-01.cpp),[📝](https://github.com/E869120/kyopro_educational_90/blob/main/sol/029-02.cpp)<br>(2) [👨‍🏫](https://raw.githubusercontent.com/E869120/kyopro_educational_90/main/editorial/029-02.jpg) / [📝](https://github.com/E869120/kyopro_educational_90/blob/main/sol/029-03.cpp)|(解法 1) 「座標圧縮」で効率化<br>(解法 2) 区間に対する処理は「セグメント木」|
|030| | | | |
Expand Down

0 comments on commit 523cc2b

Please sign in to comment.