#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int n,m,mmp[501][501];
int dis[501],w[501],num[501],node[501],c1,c2;
bool book[501]={true};
const int inf=(1<<20)-1;
void Init()
{
cin>>n>>m>>c1>>c2;
for(int i=0;i<n;i++)
cin>>node[i];
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
if(i==j) mmp[i][j]=0;
else mmp[i][j]=inf;
}
int a,b,c;
for(int i=0;i<m;i++)
{
cin>>a>>b>>c;
mmp[a][b]=mmp[b][a]=c;//无向图,所以边要存双向。
}
for(int i=0;i<n;i++)
dis[i]=mmp[c1][i];
book[c1]=false;
w[c1]+=node[c1];
num[c1]=1;
}
void Print()
{
cout<<endl;
for(int i=0;i<n;i++) cout<<w[i];
cout<<endl;
for(int i=0;i<n;i++) cout<<num[i];
cout<<endl;
for(int i=0;i<n;i++) cout<<node[i];
cout<<endl;
for(int i=0;i<n;i++) cout<<dis[i]<<" ";
}
void Dijkstra()
{
int MIN,u;
for(int i=1;i<=n-1;i++)
{
MIN=inf;
u=-1;
for(int j=0;j<n;j++)
{
if(book[j]&&dis[j]<MIN)
{
u=j;
MIN=dis[j];
}
}
book[u]=false;
if(u==-1) return;//说明剩下的顶点与起点不连通
for(int k=0;k<n;k++)
//if(book[k]) 这里应该写直接相邻的边
if(mmp[u][k]!=inf)
{
if(dis[k]>dis[u]+mmp[u][k])
{
dis[k]=dis[u]+mmp[u][k];
w[k]=w[u]+node[k];
num[k]=num[u];
}
else if(dis[k]==dis[u]+mmp[u][k])
{
if(w[k]<w[u]+node[k]) w[k]=w[u]+node[k];
num[k]+=num[u];
}
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
Init();
Dijkstra();
//cout<<num[c2]<<" "<<w[c2];
cout<<endl;
Print();
return 0;
}
dis数组打印之后,能够看到,源点到不了4号点。但画出来的话,明明是可以到的呀。