`
huyifan951124
  • 浏览: 82981 次
社区版块
存档分类
最新评论

POj2762 tarjan算法求强连通分量

 
阅读更多

题目大意:有n个房间,这些房间都有给定的路,现在要求任意两个房间能否相同(假设a与b相连通,那么只要满足a与b能够连通或者b与a能够连通即可)。,如果任意的两点能够连通输出Yes,否则输出No.

算法思路:明显的求强连通分量,再缩点,再对缩点后的图判断连通性(这里采用拓扑排序判断连通性,如果有2个及以上的点入度为0的点出现的话,说明缩点后的图是不连通的)。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<stack>
#include<queue>
using namespace std;
int a[1005][1005],m,n,t,dfn[1005],low[1005],a2[1005][1005];
bool visited[1005],ins[1005],over,over2;
int l,r,cnt,times,group[1005];
int outdeer[1005],indeer[1005];
stack<int>stk;
void tarjan(int u)
{
    stk.push(u);
    ins[u]=true;
    dfn[u]=low[u]=times++;
    for(int i=1; i<=n; i++)
    {
        if(a[u][i])
        {
            if(!dfn[i])
            {
                tarjan(i);
                low[u]=min(low[u],low[i]);
            }
            else if(ins[i])
            {
                low[u]=min(low[u],dfn[i]);
            }
        }
    }
    int k;
    if(low[u]>=dfn[u])
    {

        do
        {
            k=stk.top();
            stk.pop();
            ins[k]=false;
            group[k]=cnt;

        }
        while(u!=k);

        cnt++;

    }

}

bool topusort()
{
    queue<int>que;
    int sum2=0;
    for(int i=1;i<cnt;i++)
    {
        if(indeer[i]==0)
        {
            visited[i]=true;
            sum2++;
            que.push(i);
        }
    }

    if(sum2>=2)
        return false;
    else if(sum2==1)
    {
        while(!que.empty())
        {
            sum2=0;
            int kk=que.front();
            que.pop();

            for(int i=1;i<cnt;i++)
            {
                if(a2[kk][i])
                {
                    indeer[i]--;
                    outdeer[kk]--;
                    a2[kk][i]=0;
                }
            }
            for(int i=1;i<cnt;i++)
            {
                if(!visited[i]&&indeer[i]==0)
                {
                    sum2++;
                    visited[i]=true;
                    que.push(i);
                }
            }
            if(sum2>=2)
                return false;


        }
    }

    return true;
}
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        over=false;
        over2=true;
        memset(a,0,sizeof(a));
        memset(visited,false,sizeof(visited));
        memset(ins,false,sizeof(ins));
        memset(group,0,sizeof(group));
        memset(dfn,0,sizeof(dfn));
        memset(low,0,sizeof(low));
        memset(outdeer,0,sizeof(outdeer));
        memset(indeer,0,sizeof(indeer));
        memset(a2,0,sizeof(a2));
        scanf("%d%d",&n,&m);

        for(int i=1; i<=m; i++)
        {
            scanf("%d%d",&l,&r);
            a[l][r]=1;
        }
        times=1;
        cnt=1;
        for(int i=1; i<=n; i++)
        {
            if(!dfn[i])
                tarjan(i);
        }
        if(!stk.empty())
        {
            while(!stk.empty())
            {
                int f=stk.top();
                stk.pop();
                group[f]=cnt;
            }
            cnt++;
        }

        for(int i=1; i<=n; i++)
        {
            for(int j=1; j<=n; j++)
            {
                if(a[i][j]&&group[i]!=group[j])
                {
                    outdeer[group[i]]++;
                    indeer[group[j]]++;
                    a2[group[i]][group[j]]=1;
                }
            }
        }
        // int sum1=0,sum2=0;
       if(topusort())
        printf("Yes\n");
       else
        printf("No\n");


    }

    return 0;
}

 

0
1
分享到:
评论

相关推荐

    POJ2186-Popular Cows【Tarjan+极大强连通分量+缩点】

    POJ2186-Popular Cows ...【Tarjan+极大强连通分量+缩点】 解题报告+AC代码 http://hi.csdn.net/!s/BGDH68 附:我所有的POJ解题报告链接 . http://blog.csdn.net/lyy289065406/article/details/6642573

    LCA的tarjan算法

    对于LCA问题,有不少解法,这儿提供了tarjan算法,这是一种离线算法,读入所有输入然后一并处理,并且利用并查集的思想,从根节点开始DFS,对每一个DFS的节点,先把他的父亲节点指向本身,没访问完一个子节点,然后...

    割点、桥和连通分量1

    求解强连通分量可以使用Tarjan算法或者Kosaraju算法。这两种算法都是基于深度优先搜索的,但执行顺序不同。Tarjan算法在搜索过程中同时计算割点和SCC,而Kosaraju算法则先对原图进行一次DFS得到拓扑排序,再对反向图...

    POJ3177-Redundant Paths 【Tarjan-边双连通分量-缩点】

    POJ3177-Redundant Paths 【Tarjan-边双连通分量-缩点】 解题报告+AC代码+测试数据 http://hi.csdn.net/!s/GPAY6Z 附:我所有的POJ解题报告链接 . http://blog.csdn.net/lyy289065406/article/details/6642573

    POJ3352-Road Construction 【Tarjan-边双连通分量-缩点】

    POJ3352-Road Construction 【Tarjan-边双连通分量-缩点】 解题报告+AC代码 http://hi.csdn.net/!s/0T8UO5 附:我所有的POJ解题报告链接 . http://blog.csdn.net/lyy289065406/article/details/6642573

    POJ2942-Knights of the Round Table【Tarjan算法】

    POJ2942-Knights of the ...【Tarjan算法】 解题报告+AC代码 http://hi.csdn.net/!s/F3L8HO ================================== 我的POJ所有解题报告:http://blog.csdn.net/lyy289065406/article/details/6642573

    poj acm 题解 算法

    【标题】"poj acm 题解 算法"所指的是一份针对ACM(国际大学生程序设计竞赛)中POJ(Problemset Online Judge)平台上的题目进行解答的资源集合。ACM竞赛是全球范围内的一项编程竞赛,旨在提升大学生的算法设计和...

    POJ算法题目分类

    POJ 算法题目分类 POJ 算法题目分类是指分类所有 POJ 题目的算法思想和解决方案,本文将对算法分类进行详细的介绍。 一、基本算法 基本算法是指最基础的算法思想,如枚举、贪心、递归和分治法、递推、构造法、...

    POJ中级图算法所有题目【解题报告+AC代码】

    在编程竞赛领域,POJ(Programming Online Judge)是一个广受欢迎的在线编程平台,它提供了许多题目供参赛者解决,以提升编程和算法能力。本文主要关注的是“POJ中级图算法”的一系列题目及其解题报告和AC(Accepted...

    POJ各题算法分类和题目推荐 ACM必看

    POJ算法分类和题目推荐指南 本资源主要介绍了POJ(Online Judge)平台上各种算法分类和推荐题目,涵盖了动态规划、模拟、博弈等多种类型。以下是详细的知识点说明: 一、动态规划 动态规划是一种非常重要的算法...

    图论中的连通性问题2222

    在解决强连通子图问题时,可以使用Tarjan算法,该算法可以在O(n+m)时间内找到所有的强连通子图。Tarjan算法的基本思想是使用DFS搜索图,然后根据搜索结果来判断强连通子图。 Tarjan算法的步骤如下: 1. 对图进行...

    poj算法题目实现.zip_algorithm_arrangement4hv_conditionyis_poj problems

    在本压缩包“poj算法题目实现.zip”中,包含了五个经典的编程竞赛题目,主要针对的是POJ(Programming Online Judge)平台。这些题目是程序员提升算法能力、锻炼编程技巧的重要资源。下面,我们将详细探讨每个题目...

    POJ练习题算法分类

    根据提供的文件信息,我们可以将POJ练习题中的算法进行分类,并对每一类中的知识点进行详细的阐述。POJ(Pacific Ocean Judge)是一个在线编程平台,它提供了丰富的编程题目,旨在帮助学习者掌握各种基础算法和数据...

    北大POJ初级-基本算法

    【北大POJ初级-基本算法】是一系列针对北京大学在线编程平台POJ的初级算法题目解题报告和通过(AC)代码的集合。这个资源对于学习算法基础和提升编程能力非常有帮助,尤其适合初学者。POJ是许多计算机科学与技术专业...

    北大POJ初级-图算法

    【北大POJ初级-图算法】是一系列针对北京大学在线编程平台POJ(Problem Online Judge)上的初级编程题目,重点在于图论算法的应用。这个解题报告集合了多种图算法的实现,帮助学习者掌握如何在实际问题中运用这些...

    ACM-POJ 算法训练指南

    4. **强连通分量**:识别图中的强连通分量(poj2186)。 5. **割点和桥**:识别图中的关键节点和边(poj3352)。 ### 十二、进阶数据结构 1. **高级数据结构**:如树状数组、线段树(poj2528, poj2828, poj2777, ...

    POJ各题算法分类和题目推荐.pdf

    POJ各题算法分类和题目推荐.pdf

    poj图论题目汇总

    - **知识点**:强连通分量算法,如Kosaraju算法或Tarjan算法,用于找出图中的强连通分量。 #### 1251 Jungle Roads - MST - **知识点**:最小生成树(MST),一种用于构造连接图中所有顶点且总权重最小的树的算法...

    poj题目分类

    3. 多边型的简单算法(求面积)和相关判定(点在多边型内,多边型是否相交):例如 poj1408、poj1584。 4. 凸包:例如 poj2187、poj1113。 这些知识点涵盖了算法、数据结构、数学、计算几何学等领域的多个方面,为...

    POJ 1751 求最小生成树prim算法(JAVA)

    标题 "POJ 1751 求最小生成树Prim算法(JAVA)" 提到的是一个编程挑战,涉及图论中的经典算法——Prim算法。在计算机科学中,Prim算法是用于寻找加权无向图的最小生成树的一种有效方法。最小生成树是一棵树形结构,...

Global site tag (gtag.js) - Google Analytics