1003 Emergency (25分)

之前写的floyd被卡了?????
心态炸裂之dijkstra

#include<iostream>
#include<cstring>

using namespace std;

const int N = 510;

int g[N][N], cnt[N], nums[N], dist[N], w[N], st[N];
int n, m, c1, c2;

void dijkstra(){
    dist[c1] = 0;
    cnt[c1] = 1;
    nums[c1] = w[c1];
    for(int i = 0; i < n; i ++){
        int k = -1;
        for(int j = 0; j < n; j ++)
            if(st[j] == 0 && (k == -1 || dist[k] > dist[j]))
                k = j;
        
        st[k] = 1;
        
        for(int j = 0; j < n; j ++)
            if(dist[j] > dist[k] + g[k][j]){
                dist[j] = dist[k] + g[k][j];
                cnt[j] = cnt[k];
                nums[j] = nums[k] + w[j];
            }else if(dist[j] == dist[k] + g[k][j]){
                cnt[j] += cnt[k];
                nums[j] = max(nums[j], w[j] + nums[k]);
            }
    }
}

int main(){
    memset(dist, 0x3f, sizeof dist);
    memset(g, 0x3f, sizeof g);
    
    cin >> n >> m >> c1 >> c2;
    
    for(int i = 0; i < n; i ++) cin >> w[i];
    
    while(m --){
        int a, b, c;
        cin >> a >> b >> c;
        g[a][b] = g[b][a] = c;
    }
    
    dijkstra();
    
    cout << cnt[c2] << ' ' << nums[c2];
    
    return 0;
}
posted @ 2020-09-08 15:19  yys_c  阅读(133)  评论(0)    收藏  举报