重聯通分量(Tarjan+模擬棧)

在求關節點的過程中順便把每個重聯通分量求出。用數組模擬棧。

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
#define MAXN 20 //頂點的最大值
#define MAXM 40//邊數的最大值
#define min(a,b) ((a)>(b)?(b):(a))
struct edge
{
    int u,v;
    void output()
    {
        printf("%d-%d",u,v);
    }
    int comp(edge& t)
    {
        return ((u==t.u && v==t.v)||(u==t.v && v==t.u));
    }
};
edge edges[MAXM];//邊的數組(模擬棧)
int se;//棧頂
int Edge[MAXN][MAXN];
int vis[MAXN];
int n,m;//頂點數,邊數
int tmpdfn;
int dfn[MAXN];
int low[MAXN];

void init()
{
    low[1]=dfn[1]=1;
    tmpdfn=1;
    memset(vis,0,sizeof(vis));
    vis[1]=1;
    memset(edges,0,sizeof(edges));
}

void dfs(int u)
{
    for(int v=1;v<=n;v++)
    {
        if(Edge[u][v]==1)
        {
            edge t;
            t.u=u;t.v=v;edges[++se]=t;
            Edge[u][v]=Edge[v][u]=2;
            if(!vis[v])
            {
                vis[v]=1;
                tmpdfn++;dfn[v]=low[v]=tmpdfn;
                dfs(v);
                low[u]=min(low[u],low[v]);
                if(dfn[u]<=low[v])
                {
                    bool firstedge=true;
                    while(1)
                    {
                        if(se<0) break;
                        if(firstedge) firstedge=false;
                        else cout<<" ";
                        edge t1;
                        t1=edges[se];
                        t1.output();
                        edges[se].u=0;edges[se].v=0;
                        se--;
                        if(t1.comp(t))break;
                    }
                    cout<<endl;
                }
            }
            else
                low[u]=min(low[u],dfn[v]);
        }
    }
}

int main()
{
    int u,v;
    int number=1;
    while(1)
    {
        scanf("%d%d",&n,&m);
        if(n==0 && m==0) break;
        memset(Edge,0,sizeof(Edge));
        for(int i=1;i<=m;i++)
        {
            cin>>u>>v;
            Edge[u][v]=Edge[v][u]=1;
        }
        if(number>1)   cout<<endl;
        number++;
        init();
        se=1;
        dfs(1);
    }
}

/*
7 9
1 2
1 3
1 6
1 7
2 3
2 4
2 5
4 5
6 7
*/


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章