我看过了这个帖子,但我仍不明白
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,m1,m2,s;
struct Edge{
int to,dis;
bool operator <(const Edge&x) const{
return x.dis<dis;
}
};
int dfn[N],low[N],belong[N],num,cnt,ru[N],f[N],vis[N];
stack<int>stk;
vector<Edge>g[N];
vector<int>block[N];
queue<int>q;
priority_queue<Edge>pq;
void tarjan(int u){
dfn[u]=low[u]=++num;
stk.push(u);
for(auto e:g[u]){
int to=e.to;
if(!dfn[to]){
tarjan(to);
low[u]=min(low[u],low[to]);
}
else if(!belong[to]){
low[u]=min(low[u],dfn[to]);
}
}
if(low[u]==dfn[u]){
int to;cnt++;
do{
to=stk.top();
stk.pop();
belong[to]=cnt;
block[cnt].push_back(to);
}while(to!=u);
}
}
void dijkstra_topo(int s){
memset(f,0x3f3f3f3f,sizeof f);
f[s]=0;
while(!q.empty()){
int bl=q.front();
q.pop();
for(auto i:block[bl]) pq.push({i,f[i]});
while(!pq.empty()){
auto u=pq.top().to;
pq.pop();
if(vis[u]) continue;
vis[u]=1;
for(auto e:g[u]){
int to=e.to;
if(f[to]>f[u]+e.dis){
f[to]=f[u]+e.dis;
if(belong[to]==belong[u]){
pq.push({to,f[to]});
}
}
if(belong[to]!=belong[u]&&(!--ru[belong[to]])){
q.push(belong[to]);
}
}
}
}
}
int main(){
cin>>n>>m1>>m2>>s;
for(int i=1;i<=m1;i++){
int u,v,w;cin>>u>>v>>w;
g[u].push_back({v,w});
g[v].push_back({u,w});
}
for(int i=1;i<=n;i++){
if(!dfn[i]) tarjan(i);
}
for(int i=1;i<=m2;i++){
int u,v,w; cin>>u>>v>>w;
g[u].push_back({v,w});
ru[belong[v]]++;
}
for(int i=1;i<=cnt;i++) if(!ru[i]) q.push(i);
dijkstra_topo(s);
for(int i=1;i<=n;i++){
if(f[i]==0x3f3f3f3f) cout<<"NO PATH"<<endl;
else cout<<f[i]<<endl;
}
return 0;
}