Uva11324

来源:互联网 发布:粗集料坚固性试验数据 编辑:程序博客网 时间:2024/06/07 17:48
# 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;}

0 0
原创粉丝点击