GPLT L2-001. 緊急救援 dijkstra

題目鏈接戳這里
dijkstra模板,源點(diǎn)到點(diǎn)i,經(jīng)u有更短路,更新到i的救援隊(duì)數(shù)cjy[i]=cjy[u]+jy[i],更新到點(diǎn)i的路徑數(shù)ts[i]=ts[u]
若經(jīng)u是原先到i的同等長度的路徑,路徑之間是平等關(guān)系,和起來: ts[i] += ts[u],同理更新一下其它值,注意同等長度遇到救援隊(duì)數(shù)更多時(shí)要修改路徑.


#include <bits/stdc++.h>
#include <iostream>
using namespace std;

#define mst(a, b) memset(a, b, sizeof(a))
#define rep(i, a, b) for (int i = (a); i < (b); ++i)
const int inf = 0x3f3f3f3f, maxN = 505;
int N, M, S, D;
// 城市存的救援人數(shù) 圖 是否已在集合S中的標(biāo)記
int jy[maxN], G[maxN][maxN], ins[maxN];
// 到i城路徑條數(shù) 到i城的救援人數(shù) 前一個(gè)節(jié)點(diǎn) 最短距離d
int ts[maxN], cjy[maxN], pre[maxN], d[maxN];

void dijkstra(int s) {
    mst(ins, 0);
    mst(d, inf);
    mst(cjy, 0);
    mst(pre, -1);
    mst(ts, 0);
    cjy[s] = jy[s];
    ts[s] = 1;
    d[s] = 0;

    while (1) {
        int u = -1;
        rep(i, 0, N)
            if (!ins[i] && (u == -1 || d[i] < d[u]))
                u = i;
        if (u == -1)
            break;
        ins[u] = 1;
        rep(i, 0, N) {
            if (!ins[i] && G[u][i] < inf) {
                if (d[u] + G[u][i] < d[i]) {
                    d[i] = d[u] + G[u][i];
                    pre[i] = u;
                    cjy[i] = cjy[u] + jy[i];
                    ts[i] = ts[u];
                } else if (d[u] + G[u][i] == d[i]) {
                    ts[i] += ts[u];
                    if (cjy[u] + jy[i] > cjy[i]) {
                        cjy[i] = cjy[u] + jy[i];
                        pre[i] = u;
                    }
                }
            }
        }
    }
}

void print_path(int e) {
    int rec[maxN], idx = 0;
    while (e != -1) {
        rec[idx++] = e;
        e = pre[e];
    }
    rep(i, 0, idx) {
        if (i) printf(" ");
        printf("%d", rec[idx - 1 - i]);
    }
}

int main() {
    // freopen("data.in", "r", stdin);
    scanf("%d%d%d%d", &N, &M, &S, &D);
    rep(i, 0, N) scanf("%d", &jy[i]);

    int from, to, dis;
    mst(G, inf);
    rep(i, 0, M) {
        scanf("%d %d %d", &from, &to, &dis);
        G[from][to] = G[to][from] = dis;
    }
    dijkstra(S);
    printf("%d %d\n", ts[D], cjy[D]);
    print_path(D);

    return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容