7-6シングルソース最短パス(10ポイント)

与えられた正の重みの有向グラフの単一ソースの最短経路長を見つけるプログラムを書いてください。グラフには、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;
}

おすすめ

転載: blog.csdn.net/weixin_45845039/article/details/113729675