Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define PB push_back
- #define ZERO (1e-10)
- #define INF (1<<29)
- #define CL(A,I) (memset(A,I,sizeof(A)))
- #define DEB printf("DEB!\n");
- #define D(X) cout<<" "<<#X": "<<X<<endl;
- #define EQ(A,B) (A+ZERO>B&&A-ZERO<B)
- typedef long long ll;
- typedef long double ld;
- typedef pair<ll,ll> pll;
- typedef vector<int> vi;
- typedef pair<int,int> ii;
- typedef vector<ii> vii;
- #define IN(n) int n;scanf("%d",&n);
- #define FOR(i, m, n) for (int i(m); i < n; i++)
- #define REP(i, n) FOR(i, 0, n)
- #define F(n) REP(i, n)
- #define FF(n) REP(j, n)
- #define FT(m, n) FOR(k, m, n)
- #define aa first
- #define bb second
- void ga(int N,int *A){F(N)scanf("%d",A+i);}
- #define MX (1024)
- vi g[MX],G[MX],e[MX],R[MX];
- int cn[MX],C[MX],I[MX],H[MX],L,S[MX];
- void CLR(int N=MX){CL(S,L=0);F(N)g[i].clear(),e[i].clear(),G[i].clear(),R[i].clear(),cn[i]=I[i]=0;}
- void dfs1(int x){
- cn[x]=1;
- for(auto h:g[x])if(!cn[h])dfs1(h);
- H[L++]=x;
- }
- void dfs2(int x,int c){
- cn[x]=0,C[x]=c;
- for(auto h:e[x])if(cn[h])dfs2(h,c);
- }
- #define ADD(A,B) (g[A].PB(B),e[B].PB(A))
- int ini(int N){
- F(N)if(!cn[i])dfs1(i);
- int I(0);
- for(int i(L-1);~i;--i)if(cn[H[i]])dfs2(H[i],++I);
- F(N)++S[C[i]-1];
- F(N)for(auto&h:g[i])if(C[i]!=C[h])G[C[i]-1].PB(C[h]-1),R[C[h]-1].PB(C[i]-1);
- F(I)sort(G[i].begin(),G[i].end()),unique(G[i].begin(),G[i].end());//+/-
- return I;
- }
- int N,M,a,b,X,dp[MX];
- int dfs(int u){
- int &v(dp[u]);
- if(~v)return v;
- v=S[u];
- for(auto&h:G[u])v=max(v,dfs(h)+S[u]);
- return v;
- }
- int main(void){
- IN(tt)F(tt){
- scanf("%d%d",&N,&M);
- CLR(N),X=0,CL(dp,-1);
- F(M)scanf("%d%d",&a,&b),--a,--b,ADD(a,b);
- N=ini(N);
- F(N)X=max(X,dfs(i));
- printf("%d\n",X);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment