与えられた正の重みの有向グラフの単一ソースの最短経路長を見つけるプログラムを書いてください。グラフには、0からn-1までの番号が付けられたn個の頂点が含まれ、頂点0がソースポイントとして使用されます。
入力形式:
グラフの頂点とエッジの数をそれぞれ表す2つの正の整数nとeの最初の行を入力します。ここで、nは20000を超えず、eは1000を超えません。次の行eは各エッジの情報を表し、各行には3つの非負の整数a、b、およびcが含まれます。ここで、aとbはエッジの端点番号を表し、cは重みを表します。辺は端点番号の順に配置されていません。
出力形式:
出力は整数の行です。これは、ソースポイント0から各頂点(ソースポイントからソースポイントまでを除く)までの最短パス長で、各整数の後にスペースがあり、頂点番号の順に配置されます。 。ソースポイントから頂点までの最短経路がない場合、経路長は出力されません。
入力サンプル:
4 4
0 1 1
0 3 1
1 3 1
2 0 1
サンプル出力:
1 1
隣接リストストレージ、隣接行列は適切ではありません
#include <iostream>
#include <vector>
using namespace std;
typedef struct {
int v, w;
} Node;
const int inf = 65535;
int n, e;
int dis[20001];
vector<Node> v[20001];
bool vis[20001] = {
false};
void dijkstra(int s) {
fill(dis, dis + 20001, inf);
dis[0] = 0;
for (int i = 0; i < n; i++) {
int u = -1, minx = inf;
for (int j = 0; j < n; j++) {
if (!vis[j] && dis[j] < minx) {
u = j;
minx = dis[j];
}
}
if (u == -1)
break;
vis[u] = true;
for (int j = 0; j < v[u].size(); j++) {
int x = v[u][j].v;
if (!vis[x] && dis[u] + v[u][j].w < dis[x]) {
dis[x] = dis[u] + v[u][j].w;
}
}
}
}
int main() {
scanf("%d %d", &n, &e);
for (int i = 0; i < e; i++) {
int a, b, c;
scanf("%d %d %d", &a, &b, &c);
v[a].push_back(Node{
b, c});
}
dijkstra(0);
for (int i = 1; i < n; i++) {
if (dis[i] != inf)
printf("%d ", dis[i]);
}
return 0;
}