强联通分量

int n,m,len,col,tot,ror;
int dfn[N],low[N],pre[N];
int stage[N];//记录所在的强联通分量的 
bool mark[N];
int Stack[N];
struct node
{
       int y,pre;
};
node a[N];

void init()
{
     len=1,col=0;tot=1,ror=1;
     memset(dfn,0,sizeof(dfn));
     memset(pre,-1,sizeof(pre));
     memset(mark,false,sizeof(mark));
     memset(stage,0,sizeof(stage));
 }
 
 void addpage(int s,int t)
 {
      a[len].y=t;
      a[len].pre=pre[s];
      pre[s]=len++;
  }
void dfs(int x)
{
     cout<<x<<endl;
     Stack[ror++]=x;
     dfn[x]=low[x]=tot++;
     mark[x]=true;
     for(int i=pre[x]; i!=-1; i=a[i].pre)
     {
        int y=a[i].y;
        if(!dfn[y])
        {
            cout<<"sdf"<<endl;
            dfs(y);
            low[x]=min(low[x],low[y]);
        }else if(mark[y]==true)
          low[x]=min(low[x],low[y]);
     }
     int i;
     if(dfn[x]==low[x])
     {
        ++col;
        do{
              i=Stack[--ror]; 
              mark[i]=false;
               stage[i]=col;  
           }while(i!=x);
     }
 }

void scan()
{
     //建图 
}
int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        init();
        scan();
        rep(i,n) 
         if(dfn[i]==0) dfs(i); 
     }
    return 0;
}

你可能感兴趣的:(强联通分量)