# poj2553The Bottom of a Graph(强连通+缩点)

The Bottom of a Graph
 Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 7699 Accepted: 3161

Description

We will use the following (standard) definitions from graph theory. Let V be a nonempty and finite set, its elements being called vertices (or nodes). Let E be a subset of the Cartesian product V×V, its elements being called edges. Then G=(V,E) is called a directed graph.
Let n be a positive integer, and let p=(e1,...,en) be a sequence of length n of edges ei∈E such that ei=(vi,vi+1) for a sequence of vertices (v1,...,vn+1). Then p is called a path from vertex v1 to vertex vn+1 in G and we say that vn+1 is reachable from v1, writing (v1→vn+1)
Here are some new definitions. A node v in a graph G=(V,E) is called a sink, if for every node w in G that is reachable from vv is also reachable from w. The bottom of a graph is the subset of all nodes that are sinks, i.e.,bottom(G)={v∈V|∀w∈V:(v→w)⇒(w→v)}. You have to calculate the bottom of certain graphs.

Input

The input contains several test cases, each of which corresponds to a directed graph G. Each test case starts with an integer number v, denoting the number of vertices of G=(V,E), where the vertices will be identified by the integer numbers in the set V={1,...,v}. You may assume that 1<=v<=5000. That is followed by a non-negative integer e and, thereafter, e pairs of vertex identifiers v1,w1,...,ve,we with the meaning that (vi,wi)∈E. There are no edges other than specified by these pairs. The last test case is followed by a zero.

Output

For each test case output the bottom of the specified graph on a single line. To this end, print the numbers of all nodes that are sinks in sorted order separated by a single space character. If the bottom is empty, print an empty line.

Sample Input

3 3
1 3 2 3 3 1
2 1
1 2
0


Sample Output

1 3
2


Source

#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 5005;
const int M = 1000005;
struct edge
{
int to,next;
}g[M];
int scc[N];
int stack1[N];
int stack2[N];
int out[N];
int vis[N];
int ans[N];
int n,m;

void init()
{
for(int i = 1;i <= n;i ++)
{
scc[i] = out[i] = vis[i] = 0;
}
}

void dfs(int cur,int &sig,int &ret)
{
vis[cur] = ++ sig;
stack1[++stack1[0]] = cur;
stack2[++stack2[0]] = cur;
for(int i = head[cur];i != -1;i = g[i].next)
{
if(vis[g[i].to] == 0)
dfs(g[i].to,sig,ret);
else
if(scc[g[i].to] == 0)
{
while(vis[stack2[stack2[0]]] > vis[g[i].to])
stack2[0] --;
}
}
if(stack2[stack2[0]] == cur)
{
++ret;
stack2[0] --;
do
{
scc[stack1[stack1[0]]] = ret;
}while(stack1[stack1[0] --] != cur);
}
}

int Gabow()
{
int i,sig,ret;
stack1[0] = stack2[0] = sig = ret = 0;
for(i = 1;i <= n;i ++)
if(!vis[i])
dfs(i,sig,ret);
return ret;
}

void solve()
{
int i,j,num;
num = Gabow();
if(num == 1)
{
for(i = 1;i < n;i ++)
printf("%d ",i);
printf("%d\n",i);
return;
}
for(i = 1;i <= n;i ++)
{
for(j = head[i];j != -1;j = g[j].next)
{
if(scc[i] != scc[g[j].to])
out[scc[i]] ++;
}
}
int ansnum = 0;
for(i = 1;i <= num;i ++)
{
if(out[i] == 0)
{
for(j = 1;j <= n;j ++)
if(scc[j] == i)
ans[ansnum ++] = j;
}
}
sort(ans,ans + ansnum);
for(i = 0;i < ansnum - 1;i ++)
printf("%d ",ans[i]);
printf("%d\n",ans[i]);
}

int nextint()
{
char c;
int ret;
while((c = getchar()) > '9' || c < '0')
;
ret = c - '0';
while((c = getchar()) >= '0' && c <= '9')
ret = ret * 10 + c - '0';
return ret;
}
int main()
{
int i,j,a,b;
while(n = nextint(),n)
{
m = nextint();
init();
for(i = 1;i <= m;i ++)
{
a = nextint();
b = nextint();
g[i].to = b;
}
solve();
}
return 0;
}
//996K	110MS


• 本文已收录于以下专栏：

## poj2553The Bottom of a Graph

The Bottom of a Graph Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 1...
• imzxww
• 2018年01月31日 15:22
• 14

## poj2553The Bottom of a Graph【scc+缩点】

Language: Default The Bottom of a Graph Time Limit: 3000MS   Memory Limit: 65536K ...
• R1986799047
• 2015年11月20日 19:23
• 268

## 【连通图|强连通+缩点】POJ-2553 The Bottom of a Graph

• u012325552
• 2015年01月31日 23:36
• 718

## poj2553 The Bottom of a Graph【强连通】

• Richie_ll
• 2017年07月24日 13:54
• 137

## 【POJ】The Bottom of a Graph 强连通

The Bottom of a Graph Time Limit: 3000MS Memory Limit: 65536K Tot...
• u013368721
• 2014年07月07日 21:09
• 671

## Poj 2553 The Bottom of a Graph【强连通Kosaraju+缩点染色】

The Bottom of a Graph Time Limit: 3000MS   Memory Limit: 65536K Total Su...
• mengxiang000000
• 2016年06月12日 15:54
• 210

## NOIP 2009 最优贸易 （强连通分量、缩点、拓扑排序、SPFA、分层图）

Description传送门Solution联赛前一天在网上乱逛，发现了这个题，觉得特别妙（m-i-a-o 4 啊!），于是想写下来。2.1首先发现可以直接跑两边spfa，一个从起点出发求最低买入，一...
• hhaannyyii
• 2017年11月10日 09:04
• 70

## [强连通]poj 2553 The Bottom of a Graph

/** [强连通]poj 2553 The Bottom of a Graph 这个题目的意思还是得认真读原题，不得不吐槽那本图论的书上中文坑爹的翻译。 题目定义了有向图上一个叫做sink的东...
• cscj2010
• 2012年08月20日 12:36
• 814

## poj 2553 The Bottom of a Graph(强连通)

• 2014年11月29日 13:28
• 288

## POJ 2553：The Bottom of a Graph【强连通】

The Bottom of a Graph Time Limit : 6000/3000ms (Java/Other)   Memory Limit : 131072/65536K (Java/O...
• lin14543
• 2015年11月20日 20:56
• 184

举报原因： 您举报文章：poj2553The Bottom of a Graph(强连通+缩点) 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)