纯纯暴力,纯纯超时.....
存图用的链式前向星
#include<iostream>
using namespace std;
int ans,sum=1e8,xf,xft,sumt;
int n,m,s,d;
int k[505];
int h[505],ne[260000],v[260000],w[260000];
int vis[505];
int idx=0;
int ct=-1;
int c;
int str[505],strt[505];
void add(int a,int b,int c){
ne[++idx]=h[a];
h[a]=idx;
v[idx]=b;
w[idx]=c;
}
void dfs(int u1,int sumt,int xft,int strt[]){
if(u1==d){
if(sumt<sum){
ans=0;
xf=xft;
sum=sumt;
for(int i=0;i<=ct;i++)
str[i]=strt[i];
c=ct;
}
if(sumt==sum){
ans++;
if(xft>xf)
{xf=xft;
for(int i=0;i<=ct;i++)
str[i]=strt[i];
c=ct;
}
}
}
else{
for(int i=h[u1];i>0;i=ne[i]){
int v1=v[i];
if(vis[v1]) continue;
vis[v1]=1;
sumt+=w[i];
xft+=k[v1];
strt[++ct]=v1;
dfs(v1,sumt,xft,strt);
vis[v1]=0;
sumt-=w[i];
xft-=k[v1];
ct--;
}
}
}
int main(){
cin>>n>>m>>s>>d;
for(int i=0;i<n;i++)
scanf("%d",&k[i]);
xf=xft=k[s];
while(m--){
int n1,n2,w1;
scanf("%d%d%d",&n1,&n2,&w1);
add(n1,n2,w1);
add(n2,n1,w1);
}
vis[s]=1;
dfs(s,0,0,strt);
printf("%d %d\n",ans,xf+k[s]);
printf("%d ",s);
for(int i=0;i<c;i++)
printf("%d ",str[i]);
printf("%d",str[c]);
return 0;
}