50 pts RE求助
查看原帖
50 pts RE求助
520748
_Ch1F4N_楼主2023/7/30 15:05

如题,这是代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e6+114;
multiset<int, greater<int>> A; 
int n,m;
int cnt;
int dp[maxn][2];
vector<int> edge[maxn][2];
int IN[maxn],OUT[maxn];
int a[maxn],tmp;
inline void add(int u,int v){
    edge[u][0].push_back(v);
    edge[v][1].push_back(u);
    OUT[u]++;
    IN[v]++;
}
void topo(){
    queue<int> q;
    for(int i=1;i<=n;i++) if(IN[i]==0) dp[i][0]=0,q.push(i);
    while(q.size()>0){
        int s=q.front();
        a[++tmp]=s;
        q.pop();
        for(int nxt:edge[s][0]){
            dp[nxt][0]=max(dp[nxt][0],dp[s][0]+1);
            IN[nxt]--;
            if(IN[nxt]==0)
                q.push(nxt);
        }
    }
    for(int i=1;i<=n;i++) if(OUT[i]==0) dp[i][1]=0,q.push(i);
    while(q.size()>0){
        int s=q.front();
        q.pop();
        for(int nxt:edge[s][1]){
            dp[nxt][1]=max(dp[nxt][1],dp[s][1]+1);
            OUT[nxt]--;
            if(OUT[nxt]==0)
                q.push(nxt);
        }
    }
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
for(int i=1;i<=m;i++){
    int u,v;
    cin>>u>>v;
    add(u,v);
}
topo();
A.insert(0);
for(int i=1;i<=n;i++) A.insert(dp[a[i]][0]);
int ans=INT_MAX,x=0;
for(int i=1;i<=n;i++){
    A.erase(A.find(dp[a[i]][1]));
    for(int u:edge[a[i]][1])
        A.erase(A.find(dp[a[i]][1]+dp[u][0]+1));
    if(*A.begin()<ans){
        ans=*A.begin();
        x=a[i];
    }
    for(int u:edge[a[i]][0])
        A.insert(dp[a[i]][0]+dp[u][1]+1);
    A.insert(dp[a[i]][0]);
}
cout<<x<<' '<<ans;
return 0;
}
2023/7/30 15:05
加载中...