RT,4个WA,3个TLE,蒟蒻可以提供关注作为回报。
#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
typedef pair<int,int> PII;
const int N=50001;
int t,r,p,s,cnt,indeg[N],fa[N],dist[N];
int he[N<<1],ne[N<<1],to[N<<1],tot1,l[N<<1];
bool st[N];
queue <int> q;
vector <int> sdcc[N];
void addedge1(int x,int y,int z){
to[++tot1]=y;
ne[tot1]=he[x];
he[x]=tot1;
l[tot1]=z;
}
void dfs(int now){
fa[now]=cnt;
sdcc[cnt].push_back(now);
for(int i=he[now];i;i=ne[i]){
int v=to[i];
if(fa[v]){
continue;
}
dfs(v);
}
}
priority_queue <PII,vector<PII>,greater<PII> > pp;
int main(){
freopen("P3008_2.in","r",stdin);
freopen("P3008.out","w",stdout);
vector <int>::iterator item;
scanf("%d%d%d%d",&t,&r,&p,&s);
int u,v,w;
for(int i=1;i<=r;i++){
scanf("%d%d%d",&u,&v,&w);
addedge1(u,v,w);
addedge1(v,u,w);
}
for(int i=1;i<=t;i++){
if(!fa[i]){
fa[i]=++cnt;
dfs(i);
}
}
for(int i=1;i<=p;i++){
scanf("%d%d%d",&u,&v,&w);
++indeg[fa[v]];
addedge1(u,v,w);
}
q.push(fa[s]);
for(int i=1;i<=cnt;i++){
if(indeg[i]==0&&fa[s]!=i){
q.push(i);
}
}
memset(dist,0x3f,sizeof dist);
memset(st,false,sizeof st);
dist[s]=0;
while(q.size()){
int m=q.front();
q.pop();
for(item=sdcc[m].begin();item!=sdcc[m].end();item++){
pp.push(PII(dist[*item],*item));
}
while(pp.size()){
PII e=pp.top();
pp.pop();
if(st[e.second]==true){
continue;
}
st[e.second]=true;
for(int i=he[e.second];i;i=ne[i]){
v=to[i];
if(e.first+l[i]<dist[v]){
dist[v]=e.first+l[i];
if(fa[e.second]==fa[v]){
pp.push(PII(dist[v],v));
}
}
if(fa[e.second]!=fa[v]){
--indeg[fa[v]];
if(indeg[fa[v]]==0){
q.push(fa[v]);
}
}
}
}
}
for(int i=1;i<=t;i++){
if(dist[i]>=1e9){
printf("NO PATH\n");
}
else{
printf("%d\n",dist[i]);
}
}
}