如题,这是代码:
#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;
}