zoukankan      html  css  js  c++  java
  • 纯tarjan poj2186

    tarjan,叙叙旧咯

    #include<cstdio>
    #define maxn 50005
    int e[maxn],ne[maxn],be[maxn],all;
    int DFN[maxn],LOW[maxn],stack[maxn],curr,stak;
    bool instack[maxn];
    int num,belong[maxn],out[maxn],ans;
    void add(int a,int b){
    e[++all]=b;
    ne[all]=be[a];
    be[a]=all;
    }
    void tarjan(int p){
    int j;
    DFN[p]=LOW[p]=++curr;
    instack[p]=true;
    stack[++stak]=p;
    for(j=be[p];j!=0;j=ne[j])
    if(!DFN[e[j]]){
    tarjan(e[j]);
    if(LOW[e[j]]<LOW[p]) LOW[p]=LOW[e[j]];
    }
    else if(instack[e[j]]&&DFN[e[j]]<LOW[p])
    LOW[p]=DFN[e[j]];
    if(LOW[p]==DFN[p]){
    ++num;
    do{
    j=stack[stak--];
    belong[j]=num;
    instack[j]=false;
    }
    while (j!=p);
    }
    }
    void solve(int n){
    curr=stak=num=0;//curr当前次序 stak栈容量 num队伍号码
    for(int i=1;i<=n;i++)
    if(!DFN[i]) tarjan(i);
    }
    int main()
    {
    int i,j,n,m,a,b;
    scanf("%d%d",&n,&m);
    for(i=0;i<m;i++){
    scanf("%d%d",&a,&b);
    add(a,b);
    }
    solve(n);
    for(i=1;i<=n;i++)
    for(j=be[i];j!=0;j=ne[j])
    if(belong[e[j]]!=belong[i]) ++out[belong[i]];
    for(i=1;i<=num;i++)
    if(out[i]==0) ans++;
    if(ans==1){
    ans=0;
    for(i=1;i<=num;i++)
    if(out[i]==0)
    for(j=1;j<=n;j++)
    if(belong[j]==i) ++ans;
    printf("%d",ans);
    }else printf("0");
    return 0;
    }

  • 相关阅读:
    站立会议02(冲刺2)
    站立会议01(冲刺2)
    测试计划
    cnblogs.com用户体验
    对其他组所提建议的回复(第一阶段)
    对各个小组的评论和一些建议
    团队会议第十天
    团队绩效评估规划
    团队会议第九天
    每日scrum(1)
  • 原文地址:https://www.cnblogs.com/Mathics/p/3758135.html
Copyright © 2011-2022 走看看