poj2553——The Bottom of a Graph(强连通分量)

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 v, v 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

昨天错了一晚上,今天换个模板就过了。。。

题意是求所有的sink node,即互相有连接的点。图中第一个样例里,1、3互相连接,但2、3没有,所以答案是1和3,。所以根据定义就知道是要求强连通分量里出度为0的点,然后把这些点按顺序输出

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#define MAXN 5005
using namespace std;
struct Node
{
    int x,y,next;
} edge[MAXN*MAXN];
int dfn[MAXN],low[MAXN],vis[MAXN],s[MAXN],belong[MAXN],head[MAXN];
int in[MAXN],out[MAXN]; //入度,出度
int n,tot=0,ssum=0,ans=0,times=0,t=0,ans2;
void init()
{
    memset(head,-1,sizeof(head));
    memset(dfn,0,sizeof(dfn));
    memset(vis,0,sizeof(vis));
    memset(low,0,sizeof(low));
    memset(belong,0,sizeof(belong));
    memset(out,0,sizeof(out));
    tot=ssum=0;
}
void add(int x,int y)
{
    edge[++tot].x=x;
    edge[tot].y=y;
    edge[tot].next=head[x];
    head[x]=tot;
}
void tarjan(int x)
{
    int y,i;
    times++;
    t++;
    dfn[x]=low[x]=times;
    vis[x]=1;
    s[t]=x;
    for (i=head[x]; i; i=edge[i].next)
    {
        y=edge[i].y;
        if (vis[y]==0)
        {
            tarjan(y);
            low[x]=min(low[x],low[y]);
        }
        if (vis[y]==1)
            low[x]=min(low[x],dfn[y]);
    }
    if (dfn[x]==low[x])
    {
        ssum++;
        do
        {
            y=s[t--];
            belong[y]=ssum;
            vis[y]=2;
        }
        while (y!=x);
    }
}
int main()
{
    int i,j;
    while(cin >> n&&n)
    {
        init();
        int v,u;
        scanf("%d",&j);
        while(j--)
        {
            scanf("%d%d",&u,&v);
            add(u,v);
        }
        for (i=1; i<=n; i++)
            if (vis[i]==0)
                tarjan(i);
        for (i=1; i<=tot; i++)
            if (belong[edge[i].x]!=belong[edge[i].y])
            {
                out[belong[edge[i].x]]++;
            }
        for(i=1;i<=n;++i)
            if(out[belong[i]]==0)
            cout<<i<<" ";
        cout<<endl;
    }
}
时间: 2024-11-05 08:46:18

poj2553——The Bottom of a Graph(强连通分量)的相关文章

【poj2553】The Bottom of a Graph(强连通分量缩点)

题目链接:http://poj.org/problem?id=2553 [题意] 给n个点m条边构成一幅图,求出所有的sink点并按顺序输出.sink点是指该点能到达的点反过来又能回到该点. [思路] 不难想象sink点一定是在强连通分量中,而且强连通分量缩点后出度为0,就可以说明该强连通分量内所有的点都是sink点. 之前wa了一发是因为写成了out[i],注意是从缩点构成的dag中找出度为0的点,而不是从原来的图中找. [ac代码] #include <cstdio> #include &

POJ 2553 The Bottom of a Graph (强连通分量)

题目地址:POJ 2553 题目意思不好理解.题意是:G图中从v可达的全部点w,也都能够达到v,这种v称为sink.然后升序输出全部的sink. 对于一个强连通分量来说,全部的点都符合这一条件,可是假设这个分量还连接其它分量的话,则肯定都不是sink.所以仅仅须要找出度为0的强连通分量就可以. 代码例如以下: #include <iostream> #include <string.h> #include <math.h> #include <queue>

POJ2553 The Bottom of a Graph(强连通分量+缩点)

题目是问,一个有向图有多少个点v满足∀w∈V:(v→w)⇒(w→v). 把图的强连通分量缩点,那么答案显然就是所有出度为0的点. 用Tarjan找强连通分量: 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 #define MAXN 5555 6 #define MAXM 5555*5555 7 struct Edge{ 8 int u,v,nex

POJ2533&amp;&amp;SP1799 The Bottom of a Graph(tarjan+缩点+强连通分量)

POJ2553 SP1799 我们知道单独一个强连通分量中的所有点是满足题目要求的 但如果它连出去到了其他点那里,要么成为新的强连通分量,要么失去原有的符合题目要求的性质 所以只需tarjan缩点求出所有强连通分量,再O(E)枚举所有边,是否会成为连接一个分量与另一个分量的边--即一条出度--即可 如果一个分量没有出度,那么他中间的所有点都是符合题目要求的点 (因为快读快输加了太长所以就不贴了) const int N=5005,M=N*N>>1; int h[N],en,n,m,dfn[N]

POJ 2553 The Bottom of a Graph(Tarjan,强连通分量)

解题思路: 本题要求 求出所有满足"自己可达的顶点都能到达自己"的顶点个数,并从小到大输出. 利用Tarjan算法求出强连通分量,统计每个强连通分量的出度,出度为0的强连通分量内的顶点即为所求顶点. #include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <algorithm> #include <cmath

POJ 2553 The Bottom of a Graph(强连通分量)

POJ 2553 The Bottom of a Graph 题目链接 题意:给定一个有向图,求出度为0的强连通分量 思路:缩点搞就可以 代码: #include <cstdio> #include <cstring> #include <algorithm> #include <vector> #include <stack> using namespace std; const int N = 5005; int n, m; vector&l

poj 2553 The Bottom of a Graph【强连通分量求汇点个数】

The Bottom of a Graph Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 9641   Accepted: 4008 Description We will use the following (standard) definitions from graph theory. Let V be a nonempty and finite set, its elements being called ver

The Bottom of a Graph

                                poj——The Bottom of a Graph Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 11044   Accepted: 4542 Description We will use the following (standard) definitions from graph theory. Let V be a nonempty and fin

[tarjan] poj 2553 The Bottom of a Graph

题目链接: http://poj.org/problem?id=2553 The Bottom of a Graph Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 8899   Accepted: 3686 Description We will use the following (standard) definitions from graph theory. Let V be a nonempty and fini