传送门
一开始想用bfs过的但是冲不过去,后面改用迪杰斯特拉了,发现它只是考你熟不熟悉这个,考代码功底
#include<bits/stdc++.h>
using namespace std;
const int N=550,M=N*N;
#define int long long
int h[N],e[M],ne[M],w[M],idx,n,m,a[N],s,t;
void add(int a,int b,int c){
e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
}
int vis[N],st[N];
int d[N];
queue<int>q;
typedef pair<int,int> PII;
int mp[N][N];
int fa[N];
int cnt[N];
int sum[N];
void bfs(){
d[s]=0;
fa[s]=-1;
sum[s]=a[s];
cnt[s]=1;
for(int i=0;i<n;i++){
int u=-1;
for(int j=0;j<n;j++){
if(!st[j]&&(u==-1||d[u]>d[j]))u=j;
}
st[u]=1;
for(int j=0;j<n;j++){
if(d[j]>d[u]+mp[u][j]){
d[j]=d[u]+mp[u][j];
cnt[j]=cnt[u];
sum[j]=sum[u]+a[j];
fa[j]=u;
}
else if(d[j]==d[u]+mp[u][j]){
cnt[j]+=cnt[u];
if(sum[j]<sum[u]+a[j]){
sum[j]=sum[u]+a[j];
fa[j]=u;
}
}
}
}
// q.push(s);
// while(q.size()){
// int u=q.front();
// q.pop();
// for(int i=h[u];~i;i=ne[i]){
// int j=e[i];
// //if(vis[j])continue;
// if(d[j]>d[u]+w[i]){
// q.push(j);
// cnt[j]=1;
// sum[j]=a[j]+sum[u];
// d[j]=d[u]+w[i];
// fa[j]=u;
// }
// else if(d[j]==d[u]+w[i]){
// cnt[j]+=cnt[u];
// if(sum[j]<sum[u]+a[j]){
// sum[j]=sum[u]+a[j];
// fa[j]=u;
// }
// }
// }
// }
}
signed main(){
memset(h,-1,sizeof h);
memset(d,0x3f,sizeof d);
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m>>s>>t;
for(int i=0;i<n;i++)cin>>a[i];
memset(mp,0x3f,sizeof mp);
while(m--){
int x,y,z;
cin>>x>>y>>z;
add(x,y,z);
add(y,x,z);
mp[x][y]=mp[y][x]=z;
}
bfs();
cout<<cnt[t]<<" "<<sum[t]<<'\n';
vector<int>v;
while(fa[t]!=-1){
v.push_back(t);
t=fa[t];
}
reverse(v.begin(),v.end());
cout<<s;
for(int i=0;i<v.size();i++)cout<<" "<<v[i];
}