2014年2月2日 星期日

[UVA] 12167 - Proving Equivalences


#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<vector>
#include<stack>
using namespace std;
#define N 20005
vector<int> s[N];
stack<int> _stack;
int pre[N],sccno[N],dfs_clock,scc_cnt;
int in[N],out[N];
int dfs(int u,int fa){
    int lowu,lowv,i;
    lowu=pre[u]=++dfs_clock;
    _stack.push(u);
    for(i=0;i<s[u].size();i++){
        int v=s[u][i];
        if(!pre[v]){
            lowv=dfs(v,u);
            lowu=min(lowu,lowv);
        }
        else if(!sccno[v]){
            lowu=min(lowu,pre[v]);
        }
    }
    if(lowu==pre[u]){
        ++scc_cnt;
        while(1){
            int x=_stack.top();
            _stack.pop();
            sccno[x]=scc_cnt;
            if(x==u) break;
        }
    }
    return lowu;
}
int main(){
    int t,n,m,x,y,i,j,A,B;
    scanf("%d",&t);
    while(t--){
        scanf("%d%d",&n,&m);
        memset(in,-1,sizeof(in));
        memset(out,-1,sizeof(out));
        memset(pre,0,sizeof(pre));
        memset(sccno,0,sizeof(sccno));
        A=B=scc_cnt=0;
        for(i=1;i<=n;i++)
            s[i].clear();
        for(i=0;i<m;i++){
            scanf("%d%d",&x,&y);
            s[x].push_back(y);
        }
        for(i=1;i<=n;i++){
            dfs_clock=0;
            if(!pre[i]){
                dfs(i,-1);
            }
        }
        for(i=1;i<=n;i++){
            for(j=0;j<s[i].size();j++){
                int v=s[i][j];
                if(sccno[i]!=sccno[v]){
                    in[sccno[v]]=0;
                    out[sccno[i]]=0;
                }
            }
        }
        for(i=1;i<=scc_cnt;i++){
            if(in[i]) A++;
            if(out[i]) B++;
        }
        int ans=max(A,B);
        if(scc_cnt==1) ans=0;
        printf("%d\n",ans);
    }
}

沒有留言:

張貼留言