#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
const int inf = 0x3fffffff;
int d[25005];
int vis[25005];
int num[25005];
struct node{
int v,w;
};
int t;
vector<node>a[25005];
void spfa(int s0)
{
deque<int> q;
memset(vis,0,sizeof(vis));
memset(num,0,sizeof(num));
fill(d,d+25005,inf);
d[s0] = 0;
q.push_front(s0);
vis[s0] =1;
while(!q.empty())
{
int p = q.front();
q.pop_front();
for(int i=0;i<a[p].size();i++)
{
int v=a[p][i].v;
if(d[p]+a[p][i].w<d[v])
{
d[v] = d[p]+a[p][i].w;
if(!vis[v])
{
//if(num[v]<t)//存在负环
//{
if(!q.empty()&&d[q.front()]>d[v])//小的放前
q.push_front(v);
else
q.push_back(v);
vis[v]=1;
//}
}
}
}
vis[p]=0;
}
//return true;
}
int main()
{
int k,i,u,v,w,t,r,p,s;
//freopen("in.txt","r",stdin);
scanf("%d%d%d%d",&t,&r,&p,&s);
for(i=0;i<r;i++)
{
node t;
scanf("%d%d%d",&u,&v,&w);
t.v=v;
t.w=w;
a[u].push_back(t);
t.v=u;
a[v].push_back(t);
}
for(i=0;i<p;i++)
{
node t;
scanf("%d%d%d",&u,&v,&w);
t.v=v;
t.w=w;
a[u].push_back(t);
//t.v=u;
//a[v].push_back(t);
}
spfa(s);
for(i=1;i<=t;i++)
{
if(d[i]!=inf)
{
printf("%d\n",d[i]);
}
else
printf("NO PATH\n");
}
}
SPFA双端队列
最新推荐文章于 2021-03-03 17:26:49 发布