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

大意:问图中是不是所有两点都是任意可达的,i到j,同样j也要到达i.

就是缩成一个点即可,所以只需要判断scc是不是1即可。不需要找麻烦看度数。

#include<map>
#include<queue>
#include<cmath>
#include<cstdio>
#include<stack>
#include<iostream>
#include<cstring>
#include<algorithm>
#define LL int
#define inf 0x3f3f3f3f
#define eps 1e-8
#include<vector>
#define ls l,mid,rt<<1
#define rs mid+1,r,rt<<1|1

using namespace std;

const int Ma = 10100;
struct node{
    int to,w,next;
}q[Ma*15];
int head[Ma*15],dfn[Ma],num[Ma],du[Ma],stk[Ma],vis[Ma],low[Ma];
int cnt,top,tim,scc,out[Ma];
bool bj;
void Add(int a,int b){
    q[cnt].to = b;
    q[cnt].next = head[a];
    head[a] = cnt++;
}
void init(){
    scc =  cnt = top = 0;
    tim =  1;bj = false;
    memset(head,-1,sizeof(head));
    memset(dfn,0,sizeof(dfn));
    memset(num,0,sizeof(num));
    memset(out,0,sizeof(out));
    memset(vis,0,sizeof(vis));
    memset(low,0,sizeof(low));
}
void Tarjan(int u){
    low[u] = dfn[u] = tim++;
    vis[u] = 1;
    stk[top++] = u;
    for(int i = head[u]; ~i ; i = q[i].next){
        int v = q[i].to;
        if(!vis[v]){
            Tarjan(v);
            low[u] = min(low[u],low[v]);
        }
        else
            low[u] = min(low[u],dfn[v]);
    }
    if(low[u] == dfn[u]){
        scc++;
        while( top>0&&stk[top] != u ){
            top--;
            vis[stk[top] ] = 2;
            num[stk[top] ] = scc;
        }
    }
}
int main(){
    int n,m,i,j,k,a,b,cla;
    while(~scanf("%d%d",&n,&m)){
        if(!n&&!m) break;
        init();
        for(i = 0;i <m;++ i){
            scanf("%d%d",&a,&b);
            Add(a,b);
        }
        for(i = 1;i <= n;++i)
            if(!dfn[i])
                Tarjan(i);
        if(scc==1)
            puts("Yes");
        else
            puts("No");
    }
    return 0;
}
时间: 2025-02-01 12:57:28

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

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

题意:判定给出的有向图是不是强连通图 Tarjan算法模板题目 #include<cstdio> #include<iostream> #include<algorithm> #include<cmath> #include<set> #include<map> #include<string> #include<cstring> #include<stack> #include<queue&

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

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

[HDU] 迷宫城堡 HDU - 1269

迷宫城堡 HDU - 1269 时限: 1000MS   内存: 32768KB   64位IO格式: %I64d & %I64u 问题描述 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A房间和B房间,只说明可以通过这个通道由A房间到达B房间,但并不说明通过它可以由B房间到达A房间.Gardon需要请你写个程序确认一下是否任意两个房间都是相互连通的,即:对于任意的i和j

HDU 1269 迷宫城堡 最大强连通图题解

寻找一个迷宫是否是仅仅有一个最大强连通图. 使用Tarjan算法去求解,经典算法.必需要学习好,要自己创造出来是十分困难的了. 參考资料:https://www.byvoid.com/blog/scc-tarjan/ const int N = 10001; vector<int> gra[N]; stack<int> stk; bool inStack[N]; int dfsNum[N]; int backTrackNum[N]; int cur, sum; int n, m;

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 输入包含多组数据,输

hdu 1269 迷宫城堡

迷宫城堡 Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submission(s) : 29   Accepted Submission(s) : 12 Font: Times New Roman | Verdana | Georgia Font Size: ← → Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房

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 迷宫城堡 (tarjan算法学习)

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

HDU 1269 迷宫城堡(强连通)

HDU 1269 迷宫城堡 题目链接 题意:中文题 思路:强连通模板题 代码: #include <cstdio> #include <cstring> #include <vector> #include <stack> using namespace std; const int N = 10005; int n, m; vector<int> g[N], scc[N]; int pre[N], lowlink[N], sccno[N], d