zoukankan      html  css  js  c++  java
  • 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>
    #include <algorithm>
    #include <stdlib.h>
    #include <map>
    #include <set>
    #include <stdio.h>
    using namespace std;
    #define LL long long
    #define pi acos(-1.0)
    const int mod=1e9+7;
    const int INF=0x3f3f3f3f;
    const double eqs=1e-9;
    const int MAXN=5000+10;
    int head[MAXN], Ecnt, top, indx, scc;
    int low[MAXN], dfn[MAXN], belong[MAXN], instack[MAXN], stk[MAXN], out[MAXN];
    struct node
    {
            int u, v, next;
    }edge[1000000];
    void add(int u, int v)
    {
            edge[Ecnt].v=v;
            edge[Ecnt].next=head[u];
            head[u]=Ecnt++;
    }
    void tarjan(int u)
    {
            low[u]=dfn[u]=++indx;
            instack[u]=1;
            stk[++top]=u;
            for(int i=head[u];i!=-1;i=edge[i].next){
                    int v=edge[i].v;
                    if(!dfn[v]){
                            tarjan(v);
                            low[u]=min(low[u],low[v]);
                    }
                    else if(instack[v]){
                            low[u]=min(low[u],dfn[v]);
                    }
            }
            if(low[u]==dfn[u]){
                    scc++;
                    while(1){
                            int v=stk[top--];
                            belong[v]=scc;
                            instack[v]=0;
                            if(u==v) break;
                    }
            }
    }
    void init()
    {
            memset(head,-1,sizeof(head));
            memset(dfn,0,sizeof(dfn));
            memset(instack,0,sizeof(instack));
            memset(out,0,sizeof(out));
            Ecnt=top=indx=scc=0;
    }
    int main()
    {
            int n, m, i, j, u, v, flag;
            while(scanf("%d",&n)!=EOF&&n){
                    scanf("%d",&m);
                    init();
                    while(m--){
                            scanf("%d%d",&u,&v);
                            add(u,v);
                    }
                    for(i=1;i<=n;i++){
                            if(!dfn[i]) tarjan(i);
                    }
                    for(i=1;i<=n;i++){
                            for(j=head[i];j!=-1;j=edge[j].next){
                                    v=edge[j].v;
                                    if(belong[i]!=belong[v]){
                                            out[belong[i]]++;
                                    }
                            }
                    }
                    flag=0;
                    for(i=1;i<=n;i++){
                            if(out[belong[i]]==0){
                                    if(!flag){
                                            printf("%d",i);
                                            flag=1;
                                    }
                                    else printf(" %d",i);
                            }
                    }
                    puts("");
            }
            return 0;
    }
    


  • 相关阅读:
    tensorflow模型保存和使用08
    LSTM最基本的应用(07-3)
    手写数字识别-卷积神经网络cnn(06-2)
    python面向对象笔记
    attention机制
    dockerfile
    docker入门
    CentOS7安装Oracle11gR2
    anaconda常用的命令
    python xlrd处理表格常用方法
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4375306.html
Copyright © 2011-2022 走看看