hdu1269 迷宫城堡(tarjan入门)
来源:互联网 发布:淘宝大魔王是真是假 编辑:程序博客网 时间:2024/05/21 17:24
http://acm.hdu.edu.cn/showproblem.php?pid=1269
题意:给你n个点m个边,求给出的图是否为强连通。
ps:虽然一开始就搜到了九野巨的模板,但始终看不怎么懂,推荐两个博客博客1,博客2。本以为这算法比较简单,但还是看了很长时间。不能小看任何一个算法啊,这都是前人的精华。
思路:博客说的很详细,Tarjan就是基于dfs的算法。这里强调对变量的理解。dfn[u],节点u搜索的次序编号(时间戳);重点是low[u],u或u的子树能够追溯到的最早的栈中节点的次序号。也有人说是节点所能到达的祖先。看了博客1的模拟过程,最后一步节点2的low值居然是5??意思是最早栈中节点次序为5,还是节点所能到达祖先是5,2和5隔那么远,那有什么关系。从这点上看,还没有想通,不过慢慢来吧。
#include <stdio.h>#include <algorithm>#include <stdlib.h>#include <string.h>#include <iostream>#include <stack>#include <vector>using namespace std;typedef long long LL;const int N = 100010;const int INF = 1e8;vector<int>Map[N];stack<int>S;int dfn[N], low[N], countt, time, n, m;bool vis[N];void init(){ time = countt = 0; memset(dfn, 0, sizeof(dfn)); memset(low, 0, sizeof(low)); memset(vis, false, sizeof(vis)); for(int i = 1; i <= n; i++) { Map[i].clear(); }}void Tarjan(int u){ dfn[u] = low[u] = ++time; vis[u] = true; S.push(u); for(int i = 0; i < Map[u].size(); i++)//容器是从0开始放的 { int v = Map[u][i]; if(dfn[v] == 0) { Tarjan(v); low[u] = min(low[u], low[v]);//孩子可以到达,我也必然到达 } else if(vis[v] == 1) { low[u] = min(low[u], dfn[v]);//能到达的祖先,所以更新 } } if(dfn[u] == low[u]) { countt ++; int v; do { v = S.top(); S.pop(); vis[v] = false; }while(u != v); }}int main(){ // freopen("in.txt", "r", stdin); int u, v; while(~scanf("%d%d", &n, &m)) { if(n == 0 && m == 0) break; init(); for(int i = 1; i <= m; i++) { scanf("%d%d", &u, &v); Map[u].push_back(v); } for(int i = 1; i <= n; i++) { if(dfn[i] == 0) Tarjan(i); } if(countt > 1) { printf("No\n"); } else printf("Yes\n"); } return 0;}
0 0
- hdu1269 迷宫城堡(tarjan入门)
- [HDU1269]迷宫城堡(Tarjan)
- HDU1269 迷宫城堡(强连通分量tarjan入门题)
- HDU1269 迷宫城堡,Tarjan算法入门
- 【HDU1269】迷宫城堡(tarjan)
- HDU1269迷宫城堡(Tarjan模板题)
- hdu1269迷宫城堡(tarjan模板)
- hdu1269-图论-Tarjan-迷宫城堡
- HDU1269 迷宫城堡(tarjan判断强连通)
- [HDU1269]迷宫城堡(Tarjan求强连通分量)
- hdu1269迷宫城堡(tarjan求强连通分量模板)
- HDU1269迷宫城堡(强连通tarjan)
- HDU1269 迷宫城堡 强连通 Tarjan
- HDU1269——迷宫城堡(有向图求强连通分量,Tarjan算法)
- hdu1269 迷宫城堡 (强连通分量Tarjan算法)
- hdu1269迷宫城堡 (强连通Tarjan+邻接表)
- hdu1269 迷宫城堡 tarjan求强联通分量
- HDU1269 迷宫城堡 强联通分量Tarjan算法
- 通过sqli-labs学习sql注入——进阶挑战之less23-28a
- POJ - 2255 二叉树遍历
- UVA - 11054 Wine trading in Gergovia
- SDUT3334数据结构实验之栈七:出栈序列判定
- 线上遇到插入重复数据(重复提交)
- hdu1269 迷宫城堡(tarjan入门)
- Notification用法,注意API版本,API大于11的setLatestEventInfo()方法已经不适用
- Count The colors_zoj1610_线段树
- 【Java基础】面向对象特性
- matlab 函数
- php curl函数免ssl校验
- 初始博弈【二】Nim(hdu 1849,poj1704)
- HDU 2457DNA repair
- 关联规则挖掘 ---- Apriori算法与CBA算法