hdu 1269 迷宫城堡 强连通分量

来源:互联网 发布:陈震媳妇 淘宝店叫什么 编辑:程序博客网 时间:2024/05/18 03:48

模板题。

http://acm.hdu.edu.cn/showproblem.php?pid=1269

给一个学习强连通分量的博客:

https://www.byvoid.com/zht/blog/scc-tarjan

#include <map>#include <set>#include <queue>#include <cmath>#include <ctime>#include <cstdio>#include <cstring>#include <cstdlib>#include <iostream>#include <algorithm>#define rep(i,a,b)  for(int i = a ; i <= b ; i ++)#define rrep(i,a,b) for(int i = b ; i >= a ; i --)#define repE(p,u) for(Edge * p = G[u].first ; p ; p = p -> next)#define cls(a,x)   memset(a,x,sizeof(a))using namespace std;typedef long long LL;const int MOD = 1e9+7;const int INF = 0x3f3f3f3f;const int MAXN = 1e4+5;const int MAXE = 1e6+5;struct Edge {    int to;    Edge * next ;}E[MAXE], * EE;struct Gragh {    Edge * first ;}G[MAXN];int T,n,m;int Stack[MAXN] ; bool InStack[MAXN];int dfn[MAXN] , low[MAXN] , num[MAXN] , belong[MAXN];int idx,top,scc;void addedge(int u,int v) {    EE->to = v ; EE->next = G[u].first ; G[u].first = EE ++;} void init() {    EE = E; idx = top = scc = 0;    cls(G,0); cls(dfn,0); cls(InStack,0);}void tarjan(int u) {    int v;    dfn[u] = low[u] = ++idx;    Stack[top++] = u;    InStack[u] = true;    repE(p,u) {        v = p -> to;        if(!dfn[v]) {            tarjan(v);            if(low[u] > low[v]) low[u] = low[v];        }        else if(InStack[v] && low[u] > dfn[v])             low[u] = dfn[v];    }    if(low[u] == dfn[u]) {        scc ++;        do {            v = Stack[--top];            InStack[v] = false;            belong[v] = scc;            num[scc] ++;        } while(v != u) ;    }}void input() {    int u,v;    rep(i,1,m) {        scanf("%d %d",&u,&v);        addedge(u,v);    }}void solve() {    rep(i,1,n) {        if(!dfn[i]) tarjan(i);          }    if(scc == 1) {        puts("Yes");    }    else {        puts("No");    }}   int main(void) {    //freopen("a.in","r",stdin);    //scanf("%d",&T);    while(scanf("%d %d",&n,&m),n+m) {        init();        input();        solve();    }    return 0;}
0 0
原创粉丝点击