30pts求调
查看原帖
30pts求调
1069729
Zyh20101221楼主2025/8/30 16:56

我看过了这个帖子,但我仍不明白

#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;
}
2025/8/30 16:56
加载中...