HDU 1269 迷宫城堡 最大强连通图题解
来源:互联网 发布:淘宝商城男鞋休闲 编辑:程序博客网 时间:2024/04/30 19:40
寻找一个迷宫是否是只有一个最大强连通图。
使用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;void Tarjan(int u){inStack[u] = true;dfsNum[u] = backTrackNum[u] = ++cur;stk.push(u);for (int i = 0; i < (int)gra[u].size(); i++){int v = gra[u][i];if (!dfsNum[v]) Tarjan(v), backTrackNum[u] = backTrackNum[v] < backTrackNum[u]? backTrackNum[v] : backTrackNum[u];else if (inStack[v]) backTrackNum[u] = backTrackNum[v] < backTrackNum[u]? backTrackNum[v] : backTrackNum[u];}if (backTrackNum[u] == dfsNum[u]){++sum;while (stk.size()){int v = stk.top(); stk.pop();inStack[v] = false;if (u == v) break;}}}void solveTarjan(){sum = cur = 0;memset(dfsNum, 0, sizeof(dfsNum));for (int i = 1; i <= n; i++){if (!dfsNum[i]) Tarjan(i);}}void initGraph(){int a, b;for (int i = 1; i <= n; i++) gra[i].clear();//别忘了清空for (int i = 0; i < m; i++){scanf("%d %d", &a, &b);gra[a].push_back(b);}}int main(){while (scanf("%d %d", &n, &m) && n){initGraph();solveTarjan();if (sum == 1) puts("Yes");else puts("No");}return 0;}
1 0
- HDU 1269 迷宫城堡 最大强连通图题解
- hdu 1269 迷宫城堡 强连通分量
- HDU 1269 迷宫城堡 强连通
- HDU 1269 迷宫城堡(强连通分量)
- 【HDU】1269 迷宫城堡 强连通
- HDU 1269 迷宫城堡(强连通分量)
- HDU 1269 迷宫城堡(强连通)
- HDU 1269-迷宫城堡(强连通分量)
- HDU - 1269 迷宫城堡(强连通分量)
- [HDU 1269] 迷宫城堡 强连通分量
- hdu 1269 迷宫城堡 强连通分量
- hdu 1269 迷宫城堡【强连通+Kosaraju】
- hdu 1269 迷宫城堡【强连通Tarjan】
- hdu 1269 迷宫城堡(强连通)
- hdu 1269 迷宫城堡 强连通分量
- 【HDU】 1269 迷宫城堡 强连通分量
- HDU 1269 迷宫城堡(强连通图的判定)
- HDU 1269 迷宫城堡 -- 强连通图判断
- 不自信的人,总是憧憬别人
- 我的第一篇博文:CSDN编程挑战回文数
- 网页宽度自动适应手机屏幕宽度的方法
- 课程设计
- 常见编码格式
- HDU 1269 迷宫城堡 最大强连通图题解
- 【Nginx】如何处理HTTP配置
- 李一男离开华为时给属下的忠告!
- Table is marked as crashed and should be repaire (
- Android 蓝牙驱动 概要
- 最近写树的递归绑定写腻了,发现一篇好文章
- Servlet 工作原理解析
- Privacy of LoongCloud Studio Ltd
- 如何测试一支钢笔、电梯、纸杯等