代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1000010;
int n,m,cnt,rd[maxn],Rd[maxn],top[maxn],tot,ans,dot;
int head[maxn],Cnt,Head[maxn],dist[maxn],diss[maxn];
struct E{
int to,next;
}edge[maxn],Edge[maxn];
void add(int u,int v){
edge[++cnt].to=v;edge[cnt].next=head[u];head[u]=cnt;
}
void Add(int u,int v){
Edge[++Cnt].to=v;Edge[Cnt].next=Head[u];Head[u]=Cnt;
}
struct Heap{
priority_queue<int>q;
priority_queue<int>d;
void push(int x){
q.push(x);
}
void del(int x){
d.push(x);
}
int top(){
while(!q.empty()&&!d.empty()&&q.top()==d.top())q.pop(),d.pop();
return q.top();
}
}heap;
int main(){
ios::sync_with_stdio(false);
std::cin.tie(0);std::cout.tie(0);
cin>>n>>m;
for(int i=1;i<=m;i++){
int u,v;cin>>u>>v;
add(u,v);Add(v,u);
rd[v]++;Rd[u]++;
}
queue<int>q;
for(int i=1;i<=n;i++)if(!rd[i])q.push(i);
while(!q.empty()){
int x=q.front();q.pop();
top[++tot]=x;
for(int i=head[x];i;i=edge[i].next){
int y=edge[i].to;
rd[y]--;
if(!rd[y])q.push(y);
dist[y]=max(dist[y],dist[x]+1);
}
}
for(int i=1;i<=n;i++)if(!Rd[i])q.push(i);
while(!q.empty()){
int x=q.front();q.pop();
for(int i=Head[x];i;i=Edge[i].next){
int y=Edge[i].to;
Rd[y]--;
if(!Rd[y])q.push(y);
diss[y]=max(diss[y],diss[x]+1);
}
}
for(int i=1;i<=n;i++)heap.push(diss[i]);
ans=heap.top();
for(int i=1;i<=n;i++){
int x=top[i];
heap.del(diss[x]);
for(int j=Head[x];j;j=Edge[j].next){
int y=Edge[j].to;
heap.del(dist[y]+diss[x]+1);
}
if(heap.top()<=ans){
ans=heap.top();dot=x;
}for(int j=head[x];j;j=edge[j].next{
int y=edge[j].to;
heap.push(dist[x]+diss[y]+1);
}heap.push(dist[x]);
}
cout<<dot<<' '<<ans;
return 0;
}
本地运行是没有过样例的,但是提交后就AC了...