pku 2553 tarjan求强连通

#include <iostream>
#include <stack>
using namespace std;

const long MAXN = 5010;

typedef struct
{
    long Num;
    long Used;
    long Alive;
    long Low;
    long belong;
    void init(long pos)
    {
        Num=Used=Alive=Low=0;
        belong=pos;
    }
}Node;

long N,M;//点,边
long p[MAXN];//辅助数组
long In[MAXN];
Node vec[MAXN];//点
long Permit;//时间戳
stack <long> s;
bool hash[MAXN];
typedef struct  
{
	long v, next;
}Edge;
Edge e[MAXN*30];

inline void init()
{
	while (!s.empty())
    {
        s.pop();
    }

    long i;
    Permit=0;
	memset(hash, 0, sizeof(hash));
    memset(p,-1,sizeof(p));
    memset(In,0,sizeof(In));

    for (i=1;i<=N;++i)
    {
        vec[i].init(i);
    }

    for (i=0;i<M;++i)
    {
        long from,to;
        scanf("%ld %ld",&from,&to);
        e[i].next=p[from];
        e[i].v=to;
        p[from]=i;
    }

}

inline void update(long &a,long b)
{
    if(a>b) a=b;
}


inline void dfs(long pos)
{
    s.push(pos);
    vec[pos].Low=vec[pos].Num=++Permit;
    vec[pos].Used=vec[pos].Alive=true;

    long j;
    for (j=p[pos];j!=-1;j=e[j].next)
    {
        long to=e[j].v;
        if (vec[to].Used)
        {
            if (vec[to].Alive)
            {
                update(vec[pos].Low,vec[to].Num);
            }
        }
        else
        {
            dfs(to);
            update(vec[pos].Low,vec[to].Low);
        }
    }

    if (vec[pos].Num==vec[pos].Low)
    {
        long t;
        while ((t=s.top())!=pos)
        {
            vec[t].belong=pos;
            vec[t].Alive=false;
            s.pop();
        }
        vec[pos].belong=pos;
        vec[pos].Alive=false;
        s.pop();
    }

}

inline void Tarjan()
{
    long i;
    for (i=1;i<=N;++i)
    {
        if (!vec[i].Used)
        {
            dfs(i);
        }
    }
}

void solution()
{
	long i, j;
	for (i = 1; i <= N; ++i)
	{
		if (!hash[vec[i].belong])
		{
			for (j = p[i]; j != -1; j = e[j].next)
			{
				if (vec[i].belong != vec[e[j].v].belong)
				{
					hash[vec[i].belong] = true;
				}
			}
		}
	}
	bool flag = false;
	for (i = 1; i <= N; ++i)
	{

		if (!hash[vec[i].belong])
		{	
			if (flag)
			{
				printf(" ");
			}
			printf("%ld", i);
			flag = true;
		}
	}
	printf("\n");
}
int main()
{
	while (scanf("%ld", &N) != EOF && N)
	{
		scanf("%ld", &M);
		init();
		Tarjan();
		solution();
	}
	return 0;
}

posted on 2010-05-28 15:55  ZAFU_VA  阅读(172)  评论(0编辑  收藏  举报

导航