asd

#include <stdio.h>
#include <algorithm>
#include <cstring>
#include <cctype>
#define lson k<<1
#define rson k<<1|1
#define mid (l+r)>>1
using namespace std;

const int maxn=1000200;
int l[maxn],L[maxn],n,m;int tot1,tot2;
int ru[maxn],que[maxn],w[maxn<<2];
int f[maxn],g[maxn];
struct node
{
    int nex,ver;
} e[maxn],E[maxn];
int read()
{
    int x=0,b=1;char c=getchar();
    while(!isdigit(c)) b=c=='-'?-1:1,c=getchar();
    while(isdigit(c)) x=x*10+c-'0',c=getchar();
    return x*b;
}
void topsort()
{
    int hh=1,tt=0;
    for(int i=1;i<=n;i++) if(!ru[i]) que[++tt]=i;
    while(hh<=tt)
    {
        int x=que[hh];
        for(int i=l[x];i;i=e[i].nex)//½á¹¹ÌåÒÀ¾ÉÊÇ´æ±ß 
        {
            if(--ru[e[i].ver]==0) que[++tt]=e[i].ver;
        }
    }
    for(int i=1;i<=n;i++)
    {
        int x=que[i];
        for(int i=l[x];i;i=e[i].nex) f[e[i].ver]=max(f[e[i].ver],f[x]+1);
    }
    for(int i=n;i>=1;i--)
    {
        int x=que[i];
        for(int i=L[x];i;i=E[i].nex) g[E[i].ver]=max(g[E[i].ver],g[x]+1);
    }
    return;
}
void add(int x,int d,int k,int l,int r)
{
    if(l==r)
    {
        w[k]+=d;return;
    }
    if(mid>=x) add(x,d,lson,l,mid);else add(x,d,rson,mid+1,r);
    w[k]=w[lson]+w[rson];
    return;
}
int ask(int k,int l,int r)
{
    if(l==r) return l;
    if(w[rson]) return ask(lson,l,mid);else return ask(rson,mid+1,r);
}
void push(int x){add(x,1,1,1,n);}
void pop(int x){add(x,-1,1,1,n);}
int main()
{
    n=read();m=read();
    for(int i=1;i<=m;i++)
    {
        int u,v;u=read();v=read();ru[v]++;
        e[++tot1]=(node){l[u],v};l[u]=tot1;//zhuyi
        E[++tot2]=(node){L[v],u};L[v]=tot2;
    }
    topsort();
    for(int i=1;i<=n;i++) push(g[i]); 
    int ans=0,id=0;
    for(int i=1;i<=n;i++)
    {
        int x=que[i];
        pop(g[x]);
        for(int i=L[x];i;i=E[i].nex) pop(f[E[i].ver]+g[x]+1);//ËüÕâ¸öÊÇÕýÏòtopÐòö¾Ù£¬µ«ÊÇÊÇ·´ÏòµÄ´¦Àí 
        int now=ask(1,1,n);
        if(now<ans) ans=now,id=x;
        for(int i=l[x];i;i=e[i].nex) push(g[e[i].ver]+f[x]+1);
        push(f[x]); 
    }
    printf("%d %d",ans,id);
}

 

posted @ 2020-11-28 21:22  ILH  阅读(172)  评论(0)    收藏  举报