//spfa
#include<bits/stdc++.h>
using namespace std;
struct oppo{
int to,s,nex;
}rod[200005];
int head[25005],tot;
int t,r,p,S;
void add(int from,int to,int s){
rod[++tot].to=to;
rod[tot].s=s;
rod[tot].nex=head[from];
head[from]=tot;
}
bool flag[25005];
int dis[25005];
deque<int> v;
void work(){
memset(dis,10,sizeof(dis));
v.push_back(S);
dis[S]=0;
flag[S]=1;
while(v.size())
{
int lxl=v.front();
flag[lxl]=0;
v.pop_front();
for(int i=head[lxl];i;i=rod[i].nex)
{
int to=rod[i].to;
if(dis[to]>dis[lxl]+rod[i].s){
dis[to]=dis[lxl]+rod[i].s;
if(!flag[to])
{
flag[to]=1;
if(dis[to]<dis[v.front()]) v.push_front(to);
else v.push_back(to);
}
}
}
}
}
int main()
{
cin>>t>>r>>p>>S;
for(int i=1;i<=r;i++){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
add(b,a,c);
}
for(int i=1;i<=p;i++){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
}
work();
for(int i=1;i<=t;i++)
if(dis[i]==dis[0])
puts("NO PATH");
else
printf("%d\n",dis[i]);
return 0;
}
这份代码过不去了,超时了,这道题卡spfa /kk
已经优化,感谢提醒,实际测试已过
嘻嘻