poj 2553

原创 2016年08月31日 11:07:56

戳戳戳

题意:
如果一个点 v 能够到达 的所有点 都可以 返回来 到达 v 则称 v 是一个sink点

求 所有的 sink点

思路:
求出度 为 1 的 强连通分量 的 点
tarjan();

然后 没了 看代码

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
//by mars_ch
int n,m,tot;
int dfn[5005],low[5005],stack[5005],belong[5005],out[5005],instack[5005];
int time,top,index;
struct data
{
    int f,t,nxt;
}e[5005*5005];
int first[5005],ans[5005];
void add(int a,int b)
{
    e[++tot].f=a;
    e[tot].t=b;
    e[tot].nxt=first[a];
    first[a]=tot;
}
void tarjan(int x)
{
    dfn[x]=low[x]=++time;
    stack[++top]=x;
    instack[x]=1;
    for(int i=first[x];i!=-1;i=e[i].nxt)
    {
        int v=e[i].t;
        if(!dfn[v])
        {
            tarjan(v);
            low[x]=min(low[x],low[v]);
        }
        else if(instack[v])
        {
            low[x]=min(low[x],dfn[v]);
        }
    }
    if(low[x] == dfn[x])
    {
        ++index;
        while(1)
        {
            int t=stack[top--];
            instack[t]=0;
            belong[t]=index;
            if(t == x) break;
        }
    }
}
int main()
{
    while(scanf("%d%d",&n,&m) && n!=0)
    {
        tot=0,time=0,top=0,index=0;
        memset(first,-1,sizeof(first));
        memset(low,0,sizeof(low));
        memset(dfn,0,sizeof(dfn));
        memset(out,0,sizeof(out));
        memset(stack,0,sizeof(stack));
        for(int i=1;i<=m;i++)
        {
            int a,b;
            scanf("%d%d",&a,&b);
            add(a,b);
        }
        for(int i=1;i<=n;i++)
        {
            if(!dfn[i]) tarjan(i);
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=first[i];j!=-1;j=e[j].nxt)
            {
                if(belong[i]!=belong[e[j].t])
                {
                    out[belong[i]]++;
                }
            }
        }
        int len=0;
        for(int i=1;i<=n;i++)
        {
            if(!out[belong[i]])
            {
                ans[++len]=i;
            }
        }
        for(int i=1;i<=len;i++)
        {
            printf("%d ",ans[i]);
        }
        puts("");
    }
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

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

DescriptionWe will use the following (standard) definitions from graph theory. Let V be a nonempty a...

POJ 2553--The Bottom of a Graph【scc缩点构图 && 求出度为0的scc && 输出scc中的点】

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

POJ2553 The Bottom of a Graph 强连通 tarjan

题意:此题最难的部分即是理解题意。 注意要求得点的定义为:所有这个点能到达的点都能到达这个点。 思路: 强连通,缩点,找出出度为0的强连通分量集合,就是要求得点集合。 #inc...

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

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

poj 2553 The Bottom of a Graph 【强连通图中出度为0点】

题目:poj 2553 The Bottom of a Graph  题意:大概题意是给出一个有向图,求强连通缩点以后出度为0的点。 分析:入门题目,先强连通缩点,然后表示出度为0...

POJ 2553 The Bottom of a Graph - from lanshui_Yang

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

POJ 2553

这道题还是和其他题目相似,没有什么差别和软用#include #include #include #include #include using namespace std; const int ma...

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

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

poj2553The Bottom of a Graph【scc+缩点】

Language: Default The Bottom of a Graph Time Limit: 3000MS   Memory Limit: 65536K ...

POJ 2553 强联通缩点+找出度为0的点

题意:给你n个点,m条边,
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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