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 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
   | #include<iostream> #include<cstdio> #include<vector> #include<stack> #include<cstring> using namespace std; long long read() {     long long x=0,f=1; char c=getchar();     while(!isdigit(c)){if(c=='-') f=-1;c=getchar();}     while(isdigit(c)){x=x*10+c-'0';c=getchar();}     return x*f; } const int N=100000+100; struct road {     int to,IsBack;     road (int A,int B)     {         to=A,IsBack=B;     } }; vector <int> e[N]; vector <road> e2[N]; int belong[N],nd_tot,nd_to,low[N],dfn[N],InStack[N],cnt[N]; stack <int> st; void Tarjan(int now) {     low[now]=dfn[now]=++nd_to;     InStack[now]=true;     st.push(now);     for(int i=0;i<int(e[now].size());i++)         if(dfn[e[now][i]]==0)         {             Tarjan(e[now][i]);             low[now]=min(low[now],low[e[now][i]]);         }         else if(InStack[e[now][i]]==true)             low[now]=min(low[now],low[e[now][i]]);     if(low[now]==dfn[now])     {         nd_tot++;         while(st.empty()==false)         {             int temp=st.top();             st.pop();             belong[temp]=nd_tot;             InStack[temp]=false;             cnt[nd_tot]++;             if(temp==now)                 break;         }     } } int n,m,S,f[N][2]; int dfs(int now,int back) {     if(f[now][back]>=0) return f[now][back];     int t_ans=0;     bool OK=false;     for(int i=0;i<int(e2[now].size());i++)         if(e2[now][i].to!=S and back-e2[now][i].IsBack>=0)             t_ans=max(t_ans,dfs(e2[now][i].to,back-e2[now][i].IsBack));         else if(back>=e2[now][i].IsBack)             OK=true;     if(t_ans!=0 or OK==true)         return f[now][back]=t_ans+cnt[now];     else         return f[now][back]=0; } int main() {     n=read(),m=read();     for(int i=1;i<=n;i++)         e[i].reserve(4),         e2[i].reserve(4);     for(int i=1;i<=m;i++)     {         int s=read(),t=read();         e[s].push_back(t);     }
      for(int i=1;i<=n;i++)         if(dfn[i]==0)             Tarjan(i);     S=belong[1];     for(int i=1;i<=n;i++)         for(int j=0;j<int(e[i].size());j++)             if(belong[i]!=belong[e[i][j]])             {                 e2[belong[i]].push_back(road(belong[e[i][j]],0));                 e2[belong[e[i][j]]].push_back(road(belong[i],1));             }
      memset(f,0x80,sizeof f);     int ans=0;     for(int i=0;i<int(e2[S].size());i++)         ans=max(ans,dfs(e2[S][i].to,1-e2[S][i].IsBack));
      printf("%d",ans+cnt[S]);     return 0; }
 
 
   |