1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| #include<cstdio> #include<queue> #include<algorithm> using namespace std;
const int maxn=500005,maxe=2000005,INF=0x3f3f3f3f; int n,e,ans=INF,p; int tot,son[maxe],nxt[maxe],lnk[maxn],lnk1[maxn]; inline void add(int x,int y){ son[++tot]=y;nxt[tot]=lnk[x];lnk[x]=tot; } inline void add1(int x,int y){ son[++tot]=y;nxt[tot]=lnk1[x];lnk1[x]=tot; } int que[maxn],in[maxn],f[maxn],g[maxn]; void topo(){ int hed=0,til=0; for (int i=1;i<=n;i++) if (!in[i]) que[++til]=i; while (hed!=til){ int x=que[++hed]; for (int j=lnk[x];j;j=nxt[j]){ in[son[j]]--; if (!in[son[j]]) que[++til]=son[j]; } } for (int i=1;i<=n;i++){ f[que[i]]=max(f[que[i]],1); for (int j=lnk[que[i]];j;j=nxt[j]) f[son[j]]=max(f[son[j]],f[que[i]]+1); } for (int i=n;i>=1;i--){ g[que[i]]=max(g[que[i]],1); for (int j=lnk[que[i]];j;j=nxt[j]) g[que[i]]=max(g[que[i]],g[son[j]]+1); } } priority_queue<int> Q; int tag[maxn]; inline int Top(){ while (tag[Q.top()]) tag[Q.top()]--,Q.pop(); return Q.top(); } inline void Push(int x) {Q.push(x);} inline void Del(int x) {tag[x]++;} int main(){ scanf("%d%d",&n,&e); for (int i=1,x,y;i<=e;i++) scanf("%d%d",&x,&y),add(x,y),add1(y,x),in[y]++; topo(); for (int i=1;i<=n;i++) Push(g[i]); Push(0); for (int i=1;i<=n;i++){ int x=que[i]; for (int j=lnk1[x];j;j=nxt[j]) Del(f[son[j]]+g[x]); Del(g[x]); int t=Top(); if (t<ans) ans=t,p=x; for (int j=lnk[x];j;j=nxt[j]) Push(f[x]+g[son[j]]); Push(f[x]); } printf("%d %d",p,ans-1); return 0; }
|