#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int INF = 0x3f3f3f3f;
const int MAXN = 505;
int e[MAXN][MAXN],weight[MAXN],n,m,s,en;
int dis[MAXN],w[MAXN],num[MAXN];
int pre[MAXN];
bool vis[MAXN];
void Dijkstra(int s){
for(int i = 0; i < n; i++){
num[i] = 0;
w[i] = 0;
vis[i] = 0;
dis[i] = INF;
}
memset(dis,INF,sizeof(dis));
w[s] = weight[s];
num[s] = 1;
dis[s] = 0;
for(int i = 0; i < n - 1; i++){
int min = INF;
int u = -1;
for(int j = 0; j < n; j++){
if(vis[j] == 0 && dis[j] < min){
min = dis[j];
u = j;
}
}
if(u == -1){
break;
}
vis[u] = 1;
for(int v = 0; v < n; v++){
if(!vis[v] && e[u][v] != INF){
if(dis[v] > dis[u] + e[u][v]){
dis[v] = dis[u] + e[u][v];
num[v] = num[u];
w[v] = w[u] + weight[v];
pre[v] = u;
}
else if(dis[v] == dis[u] + e[u][v]){
num[v] = num[v] + num[u];
if(w[v] < w[u] + weight[v]){
w[v] = w[u] + weight[v];
pre[v] = u;
}
}
}
}
}
}
int main(void){
cin>>n>>m;
cin >> s >> en;
for(int i = 0; i < n; i++){
cin >> weight[i];
}
memset(e,INF,sizeof(e));
for(int i = 0; i < m; i++){
int a,b,w;
cin >> a >> b >> w;
e[a][b] = e[b][a] = min(e[b][a],w);
}
Dijkstra(s);
int i = 0,path[505],cur = en;
while(cur != s){
path[i++] = cur;
cur = pre[cur];
}
cout<<num[en]<<" "<<w[en]<<endl;
path[i] = s;
for(int j = i; j > 0; j--){
printf("%d ",path[j]);
}
printf("%d\n",en);
return 0;
}
L2-001. 紧急救援
最新推荐文章于 2018-05-09 21:25:33 发布