就是考查dijkstra算法的应用
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
#define INF 0x7FFFFFFF
const int maxn = 510;
int dis[maxn], w[maxn], num[maxn];
int n, road_num, start, des;
int weight[maxn], arc[maxn][maxn];
int pre_visit[maxn];
int visit[maxn];
int path[maxn];
void dijkstra(int s)
{
for (int i = 0; i < n; i++)
{
dis[i] = INF;
visit[i] = w[i] = num[i] = 0;
}
w[s] = weight[s];
dis[s] = 0;
num[s] = 1;
for (int i = 0; i < n; i++)
{
int minn = INF;
int mark = -1;
for (int j = 0; j < n; j++)
{
if (!visit[j] && dis[j] < minn)
{
minn = dis[j];
mark = j;
}
}
if (mark == -1)
break;
visit[mark] = 1;
for (int k = 0; k < n; k++)
{
if (!visit[k] && arc[mark][k] != INF)
{
if (dis[k] > dis[mark] + arc[mark][k])
{
dis[k] = dis[mark] + arc[mark][k];
num[k] = num[mark];
w[k] = w[mark] + weight[k];
pre_visit[k] = mark;
}
else if (dis[k] == dis[mark] + arc[mark][k])
{
num[k] = num[mark] + num[k];
if (w[k] < w[mark] + weight[k])
{
w[k] = w[mark] + weight[k];
pre_visit[k] = mark;
}
}
}
}
}
}
int main()
{
cin >> n >> road_num >> start >> des;
int s, e, w1;
for (int i = 0; i < n; i++)
{
cin >> weight[i];
for (int j = 0; j < n; j++)
{
arc[i][j] = INF;
}
}
for (int i = 0; i < road_num; i++)
{
cin >> s >> e >> w1;
arc[s][e] = arc[e][s] = min(w1, arc[s][e]);
}
dijkstra(start);
int cur = des;
int i = 0;
while (cur != start)
{
path[i++] = cur;
cur = pre_visit[cur];
}
path[i] = start;
cout << num[des] << " " << w[des] << endl;
for (int j = i; j > 0; j--)
{
cout << path[j] << " ";
}
cout << des << endl;
return 0;
}