HDU1269 迷宫城堡 (强连通图判定)

题意:判定给出的有向图是不是强连通图

Tarjan算法模板题目


#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<set>
#include<map>
#include<string>
#include<cstring>
#include<stack>
#include<queue>
#include<vector>
#include<cstdlib>
#define lson (rt<<1),L,M
#define rson (rt<<1|1),M+1,R
#define M ((L+R)>>1)
#define cl(a,b) memset(a,b,sizeof(a));
#define LL long long
#define P pair<int,int>
#define X first
#define Y second
#define pb push_back
#define fread(zcc)  freopen(zcc,"r",stdin)
#define fwrite(zcc) freopen(zcc,"w",stdout)
using namespace std;
const int maxn=100005;
const int inf=999999;

vector<int> G[maxn];

int dfn[maxn],low[maxn],s[maxn];//依次对应,访问的序号,能到达的最早的,栈
int belong[maxn];//连通分量的编号
bool ins[maxn];//是否在栈里
int cnt,num,top;//连通分量的编号,访问的序号,栈的指针

void dfs(int u){
    dfn[u]=low[u]=++num;
    s[++top]=u;
    ins[u]=true;
    int N=G[u].size();
    for(int i=0;i<N;i++){
        int v=G[u][i];
        if(!dfn[v]){
            dfs(v);
            low[u]=min(low[u],low[v]);
        }
        else if(ins[v]&&dfn[v]<low[u]){
            low[u]=dfn[v];
        }
    }
    if(low[u]==dfn[u]){
        cnt++;
        int v;
        do{
            v=s[top--];
            ins[v]=false;
            belong[v]=cnt;
        }while(v!=u);
    }
}

void Tarjan(int n){
    cnt=num=top=0;
    cl(dfn,0);
    cl(ins,false);
    cl(belong,0);
    for(int i=1;i<=n;i++)if(!dfn[i]){
        dfs(i);
    }
}

int main(){
    int n,m;
    while(~scanf("%d%d",&n,&m)&&(n||m)){
        for(int i=0;i<m;i++){
            int a,b;
            scanf("%d%d",&a,&b);
            G[a].pb(b);
        }
        Tarjan(n);
        for(int i=1;i<=n;i++){
            if(belong[i]!=cnt){
                puts("No");goto A;
            }
        }

        puts("Yes");
        A:;
        for(int i=0;i<=n;i++)G[i].clear();
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-24 17:38:11

HDU1269 迷宫城堡 (强连通图判定)的相关文章

hdu1269 迷宫城堡,有向图的强连通分量 , Tarjan算法

hdu1269 迷宫城堡 验证给出的有向图是不是强连通图... Tarjan算法板子题 Tarjan算法的基础是DFS,对于每个节点.每条边都搜索一次,时间复杂度为O(V+E). 算法步骤: 1.搜索到某一个点时,将该点的Low值标上时间戳,然后将自己作为所在强连通分量的根节点(就是赋值Dfn=Low=time) 2.将该点压入栈. 3.当点p有与点p'相连时,如果此时p'不在栈中,p的low值为两点的low值中较小的一个. 4.当点p有与点p'相连时,如果此时p'在栈中,p的low值为p的lo

hdu1269迷宫城堡 (强连通Tarjan+邻接表)

Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A房间和B房间,只说明可以通过这个通道由A房间到达B房间,但并不说明通过它可以由B房间到达A房间.Gardon需要请你写个程序确认一下是否任意两个房间都是相互连通的,即:对于任意的i和j,至少存在一条路径可以从房间i到房间j,也存在一条路径可以从房间j到房间i. Input 输入包含多组数据,输

HDU1269迷宫城堡(裸Tarjan有向图求强连通分量个数)

迷宫城堡Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 13833    Accepted Submission(s): 6174 Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A房

HDU1269 迷宫城堡(强连通图+Tarjan)

Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A房间和B房间,只说明可以通过这个通道由A房间到达B房间,但并不说明通过它可以由B房间到达A房间.Gardon需要请你写个程序确认一下是否任意两个房间都是相互连通的,即:对于任意的i和j,至少存在一条路径可以从房间i到房间j,也存在一条路径可以从房间j到房间i. Input 输入包含多组数据,输

HDU1269迷宫城堡

Tarjan算法解读:https://www.byvoid.com/zht/blog/scc-tarjan 1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<cstring> 5 #include<vector> 6 #include<stack> 7 #include<algorithm> 8 using namespace st

HDU1269 迷宫城堡

1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<vector> 5 #include<cstring> 6 using namespace std; 7 const int mxn=20000; 8 int top,stack[mxn];//栈 9 bool inst[mxn];//在栈内标志 10 int cnt,dnow;//强连通个数,当前时间

HDU 1269 迷宫城堡(强连通图的判定)

最近<算法导论>快看完图论部分了,很多有关图的算法都彻底搞懂并加以证明了.现在主要是将理解的思想用到题目中来加强下.这个题目主要是判断一下整个图是否是强连通的,很简单,可以用tarjan也可以用kosaraju.因为不要求找出所有的强连通分量,所以这里只是借用了kosaraju的思想,然后本题的解答简化的异常简单. 迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) T

hdu 1269 迷宫城堡(Targin算法)

---恢复内容开始--- 迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Swwubmission(s): 10884    Accepted Submission(s): 4878 Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单

HDU_1269_迷宫城堡(强连通分量)

迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 8872    Accepted Submission(s): 3987 Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A