求调
查看原帖
求调
1263684
Elysialr楼主2024/10/11 09:20

#include<bits/stdc++.h>
using namespace std;
struct node{
    int g=0,head=0;
    int dfn=0,low;
    bool ins=false;
    bool vis=false;
    int dis=(1<<30);
};
struct road{
    int ver,Next=0,val;
};

node f[500001];
road r[4000001];
vector<vector<int>> ans;
stack<int> s;
int num=0,tot=1,scc=0;

void rin(int x,int y,int z){
    tot++;
    r[tot].ver=y;
    r[tot].Next=f[x].head;
    r[x].val=z;
    f[x].head=tot; 
}
void vpush(){
    scc++;
    ans.push_back(vector<int>());
}
void tarjan(int x){
    f[x].dfn=f[x].low=++num;
    s.push(x);f[x].ins=true;
    for(int i=f[x].head;i!=0;i=r[i].Next){
        int y=r[i].ver;
        if(f[y].dfn==0){
            tarjan(y);
            f[x].low=min(f[x].low,f[y].low);            
        }
        else if(f[y].ins) f[x].low=min(f[x].low,f[y].dfn);
    }
    if(f[x].dfn==f[x].low){
        vpush();
        int y;
        do{
            y=s.top();s.pop();
            f[y].ins=false;
            f[y].g=scc;
            ans[scc].push_back(y);
        }while(x!=y);
    }
}
void dijkstra(int st){
    priority_queue<pair<int,int>> q;
    f[st].dis=0;
    q.push(make_pair(0,st));
    while(!q.empty()){
        int x=q.top().second;q.pop();
        if(f[x].vis) continue;
        f[x].vis=true;

        for(int i=f[x].head;i!=0;i=r[i].Next){
            int y=r[i].ver,z=r[i].val;

            if(f[y].dis>f[x].dis+z){
                f[y].dis=f[x].dis+z;
                q.push(make_pair(-f[y].dis,y));
            }
        }
    }
}
int main(){
    ans.push_back(vector<int>());
    int n,m;;
    cin>>n>>m;
    for(int i=1;i<=m;i++){
        int x,y,z;
        cin>>x>>y>>z;
        rin(x,y,z);
    }
    for(int i=1;i<=n;i++)
    if(f[i].dfn==0)
    tarjan(i);
    
    for(int i=1;i<=scc;i++)
    for(int j=0;j<ans[i].size();j++)
    for(int k=f[ans[i][j]].head;k!=0;k=r[k].Next)
    if(f[r[k].ver].g!=i)
    rin(i+n,f[r[k].ver].g+n,r[k].val);
    
    dijkstra(f[1].g+n);
    cout<<f[f[n].g+n].dis;
    
    return 0;
}


2024/10/11 09:20
加载中...