NYOJ oj 120 强连通分量之 tarjan

来源:互联网 发布:common.js是什么文件 编辑:程序博客网 时间:2024/04/29 00:41
#include <cstdio>#include <vector>#include <cstring>#include <algorithm>#define MAX 500using namespace std;int top,bet,indx,cont=0;vector <int> vc[MAX];bool DFN[MAX],stack[MAX];  int dfn[MAX],instack[MAX],low[MAX];void tarjan(int x){    int y;    dfn[x] = low[x] = ++indx;    DFN[x] = stack[x] = true;    instack[++top] = x;    for(int i=0;i<vc[x].size();i++)    {        y = vc[x][i];        if(!DFN[y])        {            tarjan(y);            low[x] = min(low[x],low[y]);// 当形成环的时候,更新每个节点的值        }        else        if(stack[y])        {            low[x] = min(low[x],dfn[y]);//  使得每个环中最后一个节点,更新成他们的 根节点        }    }    if(dfn[x]==low[x])    {                            //  每执行一次,便是一个强连通分量        ++bet;        do        {            y = instack[top--];            stack[y]=false;        }while(x!=y);    }}int main(){    int  N,n,m;    scanf("%d",&N);    while(N--)    {        scanf("%d",&n);        indx = 0,bet = 0,top = 0;        memset(dfn,0,sizeof(dfn));       //  记录访问的次数        memset(instack,0,sizeof(instack));            memset(low,0,sizeof(low));      // 一个强连通分量中的 所有值都更新成他们得得根节点        memset(stack,false,sizeof(stack));   //记录是否在栈中        memset(DFN,false,sizeof(DFN));        memset(vc,0,sizeof(vc));       for(int i=1;i<=n;i++)       {          while(scanf("%d",&m),m)          {              vc[i].push_back(m);          }       }       tarjan(1);       printf("%d\n",bet-1);    }}

原创粉丝点击