天梯赛真题L2-001紧急救援
#include<bits/stdc++.h>
using namespace std;
int G[501][501];
int r[501];
int cnt[501];
int sr[501];
int D[501];
bool f[501];
int p[501];
#define INF 0x3f3f3f3f
int n,m,s,d;
void Dijkstra();
int main()
{
cin>>n>>m>>s>>d;
memset(G,INF,sizeof(G));
for(int i = 0; i < n; i++)
{
cin>>r[i];
}
for(int i = 0; i < m; i++)
{
int a,b,c;
cin>>a>>b>>c;
G[a][b] = c;
G[b][a] = c;
}
for(int i = 0;i < n; i++)
{
G[i][i] = 0;
}
Dijkstra();
int P[501];
int D = d;
int i = 0;
while(D!=s)
{
P[i++] = D;
D = p[D];
}
P[i] = s;
cout<<cnt[d]<<" "<<sr[d]<<endl;
for(int j = i; j > 0; j--){
cout<<P[j]<<" ";
}
cout<<d;
return 0;
}
void Dijkstra()
{
int mi;
int u;
memset(D,INF,sizeof(D));
for(int i = 0; i < n; i++)
{
D[i] = G[s][i];
f[i] = false;
sr[i] = 0;
}
sr[s] = r[s];
for(int i = 0; i < n; i++)
{
if(D[i]!=INF&&i!=s) {p[i] = s;sr[i] =r[s] + r[i]; cnt[i] = 1; }
else p[i] = -1;
}
f[s] = true; cnt[s] = 1;
for(int i = 0; i < n-1; i++)
{
mi = INF;
for(int j = 0; j < n; j++)
{
if(!f[j]&&D[j] < mi)
{
u = j;
mi = D[j];
}
}
f[u] = true;
for(int j = 0; j < n; j++)
{
if(!f[j]){
if(mi+G[u][j] < D[j])
{
D[j] = mi + G[u][j];
p[j] = u;
sr[j] = r[j]+sr[u];
cnt[j] = cnt[u];
}
else if(mi+G[u][j]==D[j]){
cnt[j]+=cnt[u];
if(r[j]+sr[u]>sr[j])
{
sr[j] = r[j]+sr[u];
p[j] = u;
}
}
}
}
}
}