#include <iostream>
using namespace std;
#define N 500
struct Node {
int d;
int paths;
int maxteam;
bool done;
};
int main(int argc, char **argv) {
int m, n, src, dst, c1, c2;
int adj[N][N] = {{0}}, team[N] = {0};
Node NodeList[N] = {0};
cin >> n >> m >> src >> dst;
for(int i = 0; i < n; i ++) {
cin >> team[i];
NodeList[i].maxteam = team[i];
}
for(int i = 0; i < m; i ++) {
cin >> c1 >> c2;
cin >> adj[c1][c2];
adj[c2][c1] = adj[c1][c2];
}
int next = src;
NodeList[src].paths = 1;
NodeList[src].done = true;
while(true) {
for(int i = 0; i < n; i ++) {
if(adj[next][i] && !NodeList[i].done) {
int tmpd = NodeList[next].d + adj[next][i];
if(!NodeList[i].d || tmpd < NodeList[i].d) {
NodeList[i].paths = NodeList[next].paths;
NodeList[i].maxteam = NodeList[next].maxteam + team[i];
NodeList[i].d = tmpd;
}
else if(tmpd == NodeList[i].d) {
NodeList[i].paths += NodeList[next].paths;
int tmpt = NodeList[next].maxteam + team[i];
if(tmpt > NodeList[i].maxteam)
NodeList[i].maxteam = tmpt;
}
}
}
int minD = 0x7FFFFFFF;
for(int i = 0; i < n; i ++) {
if(NodeList[i].d && !NodeList[i].done && NodeList[i].d < minD) {
next = i;
minD = NodeList[i].d;
}
}
NodeList[next].done = true;
if(next == dst) {
break;
}
}
cout << NodeList[dst].paths << ' ' << NodeList[dst].maxteam << endl;
return 0;
}
1003. Emergency (25)
最新推荐文章于 2019-10-30 19:19:20 发布