POJ2553 The Bottom of a Graph 强连通 tarjan

原创 2011年10月30日 19:28:14

题意:此题最难的部分即是理解题意。

注意要求得点的定义为:所有这个点能到达的点都能到达这个点。

思路:

强连通,缩点,找出出度为0的强连通分量集合,就是要求得点集合。



#include<iostream>
#define min(a,b) (a<b?a:b)
using namespace std;
const int N=5005;
bool mat[N][N];
int dfn[N],low[N];
bool instack[N];
int indgr[N];
int outdgr[N];
int stack[N];
int sp;
int index;
int n,m;
int belong[N];
void tarjan(int i)
{
	dfn[i]=low[i]=index++;
	stack[sp++]=i;
	instack[i]=true;
	for(int j=1;j<=n;j++)
	{
		if(mat[i][j])
		{
			if(!dfn[j])
			{
				tarjan(j);
				low[i]=min(low[i],low[j]);
			}
			else if(instack[j])
			{
				low[i]=min(dfn[j],low[i]);
			}
		}
	}
	if(low[i]==dfn[i])
	{
		int j;
		do
		{
			j=stack[--sp];
			instack[j]=false;
			belong[j]=i;
		}while(j!=i);
	}
}
void solve()
{
	for(int i=1;i<=n;i++)
	{
		if(!dfn[i])
		{
			tarjan(i);
		}
	}
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
		{
			if(mat[i][j])
			{
				if(belong[i]!=belong[j])
				{
					indgr[belong[j]]++;
					outdgr[belong[i]]++;
				}
			}
		}
	for(int i=1;i<=n;i++)
	{
		if(outdgr[belong[i]]==0)
		{
			printf("%d ",i);
		}
	}
	printf("\n");
}
int main()
{
	while(scanf("%d%d",&n,&m),n!=0)
	{
		index=1;
		sp=1;
		memset(indgr,0,sizeof(indgr));
		memset(outdgr,0,sizeof(outdgr));
		memset(dfn,0,sizeof(dfn));
		memset(low,0,sizeof(low));
		memset(mat,0,sizeof(mat));
		memset(instack,0,sizeof(instack));
		memset(stack,0,sizeof(stack));
		memset(belong,0,sizeof(belong));
		int from,to;
		for(int i=1;i<=m;i++)
		{
			scanf("%d%d",&from,&to);
			mat[from][to]=true;
		}
		solve();
	}
	return 0;
}


相关文章推荐

POJ-2553 The Bottom of a Graph (强连通分量[Tarjan])

注意理解题意即可(只有理解了,才能看懂样例...) 满足题意的v点有两种情况: ①对于任一点w,v可达w,且w可达v,即v、w互相可达,满足该情况的点在同一个强连通分量中(且该强连通分量不与其他点连通...

POJ 2553 The Bottom of a Graph 强连通分量+缩点 tarjan or kosaraju

题目的意思是求有向图中满足“自己可达的顶点都能到达自己”的顶点个数 显然,在一个强连通分量中,每个点都符合要求,但是 如果强连通分量中有某个点跟外面的某个点相连了,这个强连通分量就不符合要求了,很显...

强连通分量 ( Tarjan,邻接链表 )——The Bottom of a Graph ( POJ 2553 )

题目链接: http://poj.org/problem?id=2553 分析: 给出一有向图,求除所以出度为0的强连通分量,然后按顺序输出其中的节点。 题解: 先用tarjantarjan求...
  • FeBr2
  • FeBr2
  • 2016年08月01日 19:23
  • 161

The Bottom of a Graph poj 2553 缩点+Tarjan

The Bottom of a Graph Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 8...

POJ2553 The Bottom of a Graph Tarjan 矩阵 pascal 解题报告

第三道tarjan,有了前两道题的经验,很快就写完了,但是万恶的初始化。。。。。。 题目大意如下:给出若干个测试样例,当奇数行的N不为0时,有两个数N,M,代表有N个点M条边,然后偶数行会有M条边的信...

POJ--2553--The Bottom of a Graph【tarjan缩点】

题意:告诉你顶点数和边数并输入边的信息,按从小到大输出出度为0的点。其实这道题英文我没看懂,看的图论书才懂的。 就是tarjan缩点,和POJ2186的代码一模一样,直接用2186的代码修改一下就A...
  • zzzz40
  • zzzz40
  • 2014年03月12日 21:40
  • 457

POJ 2553The Bottom of a Graph(Tarjan)

题意:我的英语可是一流的。。。(水)。。。没看懂题,看图看明白的。输出出度为0的团的所有元素。(猜的。。过了,说明就猜对了) #include #include #include #inclu...

ZOJ1979 POJ2553 The Bottom of a Graph,经典Tarjan

经典的强连通分量题,我用了Tarjan算法+缩点。把每个强连通分量缩点,求出每个点的出度。所谓的bottom,就是那些出度为0的强连通分量,对于所有出度不为零的连通分量里的点,都可以到达bottom中...
  • neofung
  • neofung
  • 2011年09月25日 01:51
  • 498

poj2553The Bottom of a Graph【tarjan中SCC出度是1】

Description We will use the following (standard) definitions from graph theory. Let V be a nonemp...

POJ2553————The Bottom of a Graph(tarjan算法)

The Bottom of a Graph Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 1...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ2553 The Bottom of a Graph 强连通 tarjan
举报原因:
原因补充:

(最多只允许输入30个字)