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;
}

浙公网安备 33010602011771号