UVA 11324 scc缩点+树上最长路

来源:互联网 发布:综合布线仿真软件下载 编辑:程序博客网 时间:2024/06/05 14:42
#include<bits/stdc++.h>using namespace std;const int maxn = 1010;vector<int>g[maxn];vector<int>m[maxn];int node[maxn];int pre[maxn],lowlink[maxn],sccno[maxn],dfs_clock,scc_cnt;int dp[maxn];stack<int>s;void dfs(int u){    pre[u] = lowlink[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);            lowlink[u] = min(lowlink[u],lowlink[v]);        }        else if(!sccno[v])        {            lowlink[u]  = min(lowlink[u],pre[v]);        }    }    if(lowlink[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 = 0 ;    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 get(int x){    if(dp[x])return dp[x];    int ans = 0;    for(int i = 0; i<m[x].size(); i++)    {        ans = max(ans,get(m[x][i]));    }    return dp[x] =  ans+node[x];}int main(){    int T;    scanf("%d",&T);    while(T--)    {        while(!s.empty())            s.pop();        int n,mv;        scanf("%d%d",&n,&mv);        for(int i = 0; i<=n; i++)        {            g[i].clear();        }        for(int i = 0; i<=n; i++)        {            m[i].clear();        }        int x,y;        for(int i  = 1; i<=mv; i++)        {            scanf("%d%d",&x,&y);            x--;            y--;            g[x].push_back(y);        }        find_scc(n);        memset(node,0,sizeof(node));        for(int i = 0; i<n; i++)        {            node[sccno[i]]++;        }        for(int i = 0; i<n; i++)        {            for(int j = 0; j<g[i].size(); j++)            {                int v= g[i][j];                if(sccno[i] != sccno[v])                    m[sccno[i]].push_back(sccno[v]);            }        }        int ans = 0;        memset(dp,0,sizeof(dp));        for(int i = 0; i<=scc_cnt; i++)        {            ans = max(ans,get(i));        }        cout<<ans<<endl;    }    return 0;}

0 0