标签说的是BFS。。。
太菜,不知道怎么BFS。。。是不是spfa写,就叫BFS。。。感觉不是。。。。
只是二级最短路的写法,直接搞就很容易了,简单题;
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int INF=0x3f3f3f3f;
const int N=5e2+10;
int val[N];
struct asd{
int w;
int to;
int next;
};
asd q[N*N];
int head[N*N],tol,dis[N],d[N];
int n,m,s,t;
bool vis[N];
queue<int>e;
void spfa()
{
while(!e.empty())
e.pop();
for(int i=0;i<n;i++)
{
dis[i]=INF;
d[i]=0;
vis[i]=false;
}
d[s]=val[s];
dis[s]=0;
vis[s]=true;
e.push(s);
while(!e.empty())
{
int u=e.front();e.pop();
vis[u]=0;
for(int v=head[u];v!=-1;v=q[v].next)
{
int i=q[v].to;
if(dis[i]>dis[u]+q[v].w)
{
dis[i]=dis[u]+q[v].w;
d[i]=d[u]+val[i];
if(!vis[i])
{
vis[i]=1;
e.push(i);
}
}
else if(dis[i]==(dis[u]+q[v].w))
{
if(d[i]<d[u]+val[i])
d[i]=d[u]+val[i];
}
}
}
printf("%d %d
",dis[t],d[t]);
}
void add(int a,int b,int c)
{
q[tol].to=b;
q[tol].w=c;
q[tol].next=head[a];
head[a]=tol++;
}
void init()
{
memset(head,-1,sizeof(head));
tol=0;
}
int main()
{
scanf("%d",&n);
scanf("%d",&m);
scanf("%d%d",&s,&t);
for(int i=0;i<n;i++)
scanf("%d",&val[i]);
init();
while(m--)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
add(b,a,c);
}
spfa();
return 0;
}