# include<cstdio>
# include<stack>
# include<vector>
# include<cstring>
using namespace std;
const int maxn=2000+5;
vector<int>G[maxn];
vector<int>Scc[maxn];
int pre[maxn],low[maxn],vis[maxn],value[maxn],sccno[maxn],dfs_clock,scc_cnt;
stack<int>S;
int max(int a,int b) {return a>b?a:b;}
int DAG(int o)
{
if(vis[o]) return vis[o];
if(Scc[o].size()==0) return value[o];
for(int i=0;i<Scc[o].size();i++)
{
int to=Scc[o][i];
vis[o]=max(DAG(to)+value[o],vis[o]);
}
return vis[o];
}
int dfs(int u)
{
pre[u]=low[u]=++dfs_clock;
S.push(u);
for(int i=0;i<G[u].size();i++)
{
int v=G[u][i];
if(!pre[v])
{
dfs(v);
low[u]=min(low[u],low[v]);
}else if(!sccno[v])low[u]=min(low[u],pre[v]);
}
if(low[u]==pre[u])
{
scc_cnt++;
for(;;)
{
int x=S.top();S.pop();
sccno[x]=scc_cnt;
if(x==u) break;
}
}
}
void find_scc(int n)
{
dfs_clock=scc_cnt=0;
memset(sccno,0,sizeof(sccno));
memset(pre,0,sizeof(pre));
for(int i=0;i<n;i++)
if(!pre[i]) dfs(i);
}
int in[maxn],out[maxn];
int main()
{
int T,n,m;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++) G[i].clear();//清空
for(int i=0;i<m;i++)
{
int u,v;
scanf("%d%d",&u,&v);u--;v--;
G[u].push_back(v);
}
find_scc(n);//求出scc
memset(value,0,sizeof(value));
memset(vis,0,sizeof(vis));
for(int i=0;i<scc_cnt;i++) Scc[i].clear();
for(int i=0;i<n;i++) value[sccno[i]-1]++;//
for(int u=0;u<n;u++)
for(int i=0;i<G[u].size();i++)
{
int v=G[u][i];
if(sccno[u]!=sccno[v]) Scc[sccno[u]-1].push_back(sccno[v]-1);//
}
for(int i=0;i<scc_cnt;i++)
if(!vis[i]) vis[i]=DAG(i);
int ans=0;
for(int i=0;i<scc_cnt;i++)
if(ans<vis[i]) ans=vis[i];
printf("%d\n",ans);
}
return 0;
}
Uva11324
最新推荐文章于 2016-11-18 19:57:00 发布