L2-001 紧急救援 Score 25 团体程序设计天梯赛-练习集

题目链接

#include  <bits/stdc++.h>

using namespace std;

const int MAXN = 510;

int N, M, S, D;
int num[MAXN], g[MAXN][MAXN], cnt[MAXN], weight[MAXN], path[MAXN], dis[MAXN];
bool st[MAXN];
int res;

void print(int x){
    if(x == S){
        cout << x;
        return;
    }
    print(path[x]);
    cout << " " << x;
}
void dijkstra(){
    memset(dis, 0x3f, sizeof dis);
    dis[S] = 0;
    cnt[S] = 1;
    weight[S] = num[S];
    for(int i = 1; i < N; ++i){
        int t = -1;
        for(int j = 0; j < N; ++j)
            if(!st[j] && (t == -1 || dis[j] < dis[t]))
                t = j;
        st[t] = 1;
        for(int j = 0; j < N; ++j){
            if(dis[t] + g[t][j] < dis[j]){
                dis[j] = dis[t] + g[t][j];
                cnt[j] = cnt[t];
                weight[j] = weight[t] + num[j];
                path[j] = t;
            }else if(dis[t] + g[t][j] == dis[j]){
                cnt[j] += cnt[t];
                if(weight[t] + num[j] > weight[j]){
                    weight[j] = weight[t] + num[j];
                    path[j] = t;
                }
            }
        }
    }
}


signed main(){
    memset(g, 0x3f, sizeof g);
    
    cin >> N >> M >> S >> D;
    for(int i = 0; i < N; ++i) cin >> num[i];
    for(int i = 1; i <= M; ++i){
        int st, ed, le;
        cin >> st >> ed >> le;
        g[st][ed] = min(g[st][ed], le);
        g[ed][st] = min(g[ed][st], le);
    }

    dijkstra();

    cout << cnt[D] << " " << weight[D] << endl;
    print(D);
    
    return 0;
}
posted @ 2025-02-24 09:14  awei040519  阅读(11)  评论(0)    收藏  举报