1003 Emergency 25

发布于:2024-12-18 ⋅ 阅读:(44) ⋅ 点赞:(0)

 

 

#include <cstdio>
#include <vector>
#include <algorithm>

using namespace std;
const int maxn = 505;
int G[maxn][maxn],rescueNum[maxn],vis[maxn]={0},dis[maxn],teamNum[maxn]={0},pathNum[maxn]={0};
int n,m,s,e,INF=1000000000;

int findNotVisMin(){
    int minIdx = -1;
    int minDis = INF;
    for(int i = 0; i < n; i++){
        if(vis[i] == 0 && dis[i] < minDis){
            minIdx = i;
            minDis = dis[i];
        }
    }
    return minIdx;
}
int main() {
    scanf("%d%d%d%d", &n, &m, &s, &e);
    int tmp,from,to,weight;
    for(int i = 0; i < n; i++){
        scanf("%d", &tmp);
        rescueNum[i] = tmp;
    }
    fill(G[0], G[0]+maxn*maxn, INF);
    for(int i = 0; i < m; i++){
        scanf("%d%d%d", &from, &to, &weight);
        G[from][to] = G[to][from] = weight;
    }
    fill(dis, dis+maxn, INF);
    dis[s] = 0;
    teamNum[s] = rescueNum[s];
    pathNum[s] = 1;
    for(int i = 0; i < n; i++){
        int min = findNotVisMin();
        if(min == -1) break;
        vis[min] = 1;
        for(int j = 0; j < n; j++){
            if(vis[j] == 0 && G[min][j] != INF){
                if(dis[min]+G[min][j] < dis[j]){
                    dis[j] = dis[min]+G[min][j];
                    pathNum[j] = pathNum[min];
                    teamNum[j] = teamNum[min] + rescueNum[j];
                }else if(dis[min]+G[min][j] == dis[j]){
                    pathNum[j] += pathNum[min];
                    if(teamNum[min]+rescueNum[j] > teamNum[j]){
                        teamNum[j] = teamNum[min]+rescueNum[j];
                    }
                }
            }
        }
    }
    printf("%d %d\n", pathNum[e], teamNum[e]);
    return 0;
}


网站公告

今日签到

点亮在社区的每一天
去签到