大佬们救救孩子,似乎跑完Tarjan没有去完循环
查看原帖
大佬们救救孩子,似乎跑完Tarjan没有去完循环
337825
romycyy楼主2022/8/6 16:01
#include <iostream>
#include <algorithm>
#include <stack>
#include <queue>
#include <vector>
using namespace std;

stack<int> s;
queue<int> tov;
int p,n,m,a,b;
int dfn[3002] = {}, low[3002] = {}, c[3002] = {};
int cnt1 = 0, cnt2 = 1, cur, temp;
int ans=3001,mon=0;

struct ps{
    vector<int> nei;
    int cost = 23333;
}l[3002];

struct p{
    vector<int> nei;
    int cost = 23333;
    int ind = 0;
    int num = 3002;
    bool cr = false;
}nl[3002];

void Tarjan(int x){
    dfn[x] = cnt1;
    low[x] = cnt1;
    cnt1++;
    s.push(x);
    for(int i=0;i<l[x].nei.size();i++){
        cur = l[x].nei[i];
        if(!dfn[cur]){
            Tarjan(cur);
            low[x] = min(low[x],low[cur]);
        }
        else if(!c[cur]){
            low[x] = min(low[x],dfn[cur]);
        }
    }
    if(dfn[x]==low[x]){
        cur = s.top();
        c[cur] = cnt2;
        while(cur!=x){
            s.pop();
            cur = s.top();
            c[cur] = cnt2;
        }
        s.pop();
        cnt2++;
    }
}

void rel(int x){
    for(int i=0;i<nl[x].nei.size();i++){
        cur = nl[x].nei[i];
        nl[cur].ind--;
        if(nl[cur].ind==0){
            nl[cur].cr = true;
            rel(cur);
        }
    }
}

int main(int argc, const char * argv[]) {
    cin>>n>>p;
    for(int i=0;i<p;i++){
        cin>>a>>b;
        l[a].cost = b;
    }
    cin>>m;
    for(int i=0;i<m;i++){
        cin>>a>>b;
        l[a].nei.push_back(b);
    }
    
    for(int i=1;i<=n;i++){
        if(!dfn[i]) Tarjan(i);
    }
    for(int i=1;i<=n;i++){
        for(int j=0;j<l[i].nei.size();j++){
            if(c[i]!=c[l[i].nei[j]]){
                nl[c[i]].nei.push_back(c[l[i].nei[j]]);
                nl[c[l[i].nei[j]]].ind++;
                if(c[l[i].nei[j]]) cout<<c[i];
            }
        }
        nl[c[i]].cost = min(nl[c[i]].cost,l[i].cost);
        nl[c[i]].num = min(nl[c[i]].num,i);
    }
    for(int i=1;i<cnt2;i++){
        tov.push(i);
    }
    while(!tov.empty()){
        cur = tov.front();
        cout<<cur<<endl;
        tov.pop();
        if(nl[cur].ind==0){
            if(nl[cur].cr) continue;
            if(nl[cur].cost!=23333){
                mon+=nl[cur].cost;
                nl[cur].cr = true;
                rel(cur);
            }
            else{
                ans = min(ans,nl[cur].num);
                for(int i=0;i<nl[cur].nei.size();i++){
                    temp = nl[cur].nei[i];
                    nl[temp].ind--;
                }
            }
        }
        else{
            tov.push(cur);
        }
    }
    if(ans==3001){
        cout<<"YES"<<endl;
        cout<<mon<<endl;
    }
    else{
        cout<<"NO"<<endl;
        cout<<ans<<endl;
    }
    return 0;
}
2022/8/6 16:01
加载中...