首页 > 代码库 > HDU 1269 迷宫城堡(强连通)
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], dfs_clock, scc_cnt; stack<int> S; void dfs_scc(int u) { pre[u] = lowlink[u] = ++dfs_clock; S.push(u); for (int i = 0; i < g[u].size(); i++) { int v = g[u][i]; if (!pre[v]) { dfs_scc(v); lowlink[u] = min(lowlink[u], lowlink[v]); } else if (!sccno[v]) lowlink[u] = min(lowlink[u], pre[v]); } if (lowlink[u] == pre[u]) { scc_cnt++; int x = S.top(); while (x != u) { sccno[x] = scc_cnt; S.pop(); x = S.top(); } } } void find_scc(int n) { dfs_clock = scc_cnt = 0; memset(sccno, 0, sizeof(sccno)); memset(pre, 0, sizeof(pre)); for (int i = 1; i <= n; i++) if (!pre[i]) dfs_scc(i); } int main() { while (~scanf("%d%d", &n, &m) && n || m) { int u, v; for (int i = 1; i <= n; i++) g[i].clear(); while (m--) { scanf("%d%d", &u, &v); g[u].push_back(v); } find_scc(n); if (scc_cnt <= 1) printf("Yes\n"); else printf("No\n"); } return 0; }
HDU 1269 迷宫城堡(强连通)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。