强连通图之HDU1269 迷宫城堡

来源:互联网 发布:python 流对象如何传输 编辑:程序博客网 时间:2024/04/30 14:29

Tarjan模板。如果只有一个连通图输出Yes,否则No。

#include <stdio.h>#include <ctype.h>#include <string.h>#include <stdlib.h>#include <limits.h>#include <math.h>#include <algorithm>#include <stack>#include <queue>#include <vector>#include <map>#include <set>#include <string>#include <sstream>using namespace std;#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1typedef long long LL;const double pi=4.0*atan(1.0);const int MAXN=10005;vector<int> g[MAXN];int dfn[MAXN],lowlink[MAXN],sccno[MAXN],dfs_clock,scc_cnt;stack<int> s;void dfs(int u){dfn[u]=lowlink[u]=++dfs_clock;s.push(u);for(int i=0;i<g[u].size();i++){int v=g[u][i];if(!dfn[v]){dfs(v);lowlink[u]=min(lowlink[u],lowlink[v]);}else if(!sccno[v]){lowlink[u]=min(lowlink[u],dfn[v]);}}if(lowlink[u]==dfn[u]){scc_cnt++;while(1){int x=s.top();s.pop();sccno[x]=scc_cnt;if(x==u)break;}}}void Tarjan(int n){dfs_clock=scc_cnt=0;memset(sccno,0,sizeof(sccno));memset(dfn,0,sizeof(dfn));while(!s.empty())s.pop();for(int i=1;i<=n;i++)//下标1到nif(!dfn[i])dfs(i);}int main(){int i,j,k;int T;int n,m;while(scanf("%d%d",&n,&m)!=EOF){if(n==0&&m==0)return 0;for(i=1;i<=n;i++)g[i].clear();for(i=1;i<=m;i++){scanf("%d%d",&j,&k);g[j].push_back(k);}Tarjan(n);if(scc_cnt==1)printf("Yes\n");elseprintf("No\n");}return 0;}


0 0
原创粉丝点击