HDU 1269 迷宫城堡 (裸的Tarjan算法求强连通分量, 可作模版)
2017-10-10 09:36
609 查看
题目链接 : HDU 1269
题意: 给定有向边,问是否两两可达,即整个图是个强连通图(强连通分量=1)
解法: 直接上tarjan板子求解
题意: 给定有向边,问是否两两可达,即整个图是个强连通图(强连通分量=1)
解法: 直接上tarjan板子求解
#include<bits/stdc++.h> #define rep(i, a, b) for(int i=a; i<=b; ++i) #define repp(i, a, b) for(int i=b; i>=a; --i) using namespace std; const int maxn = 1e4+5; struct edge{ int to, next; }node[maxn*10]; int first[maxn], len; void adde(int u, int v){ node[len].to = v; node[len].next = first[u]; first[u] = len++; return ; } bool ins[maxn]; int n, m, ans, cnt; int dfn[maxn], low[maxn]; int s[maxn], top; void tarjan(int u){ s[++top] = u; ins[u] = 1; low[u] = dfn[u] = ++cnt; for(int i=first[u]; ~i; i=node[i].next){ int v = node[i].to; if(!dfn[v]) { tarjan(v); low[u] = min(low[u], low[v]); } else if(ins[v]){ low[u] = min(low[u], dfn[v]); } } if(dfn[u] == low[u]){ ++ans; int j =-1; while(j!=u && top){ j = s[top--]; ins[j] = 0; } } } int main(){ // freopen("in.txt", "r", stdin); while(~scanf("%d %d", &n, &m), n||m){ int u, v; len = 0, ans=0, cnt=0, top=0; memset(ins, false, sizeof(ins)); memset(dfn, 0, sizeof(dfn)); memset(first, -1, sizeof(first)); rep(i, 1, m){ scanf("%d %d", &u, &v); adde(u, v); } rep(i, 1, n) { if(dfn[i]==0) tarjan(i); } if(ans==1) printf("Yes\n"); else printf("No\n"); } return 0; }
相关文章推荐
- HDU 1269 迷宫城堡 [强连通分量] [Tarjan]
- HDU 1269 迷宫城堡 Tarjan强连通分量
- HDU 1269 迷宫城堡 (有向图强连通分量Tarjan)
- [ACM] HDU 1269 迷宫城堡(Tarjan算法求强联通分量)
- HDU 1269 迷宫城堡【Tarjan强连通分量 模板】
- hdu 1269 迷宫城堡(强连通 tarjan )
- hdu 1269 迷宫城堡(tarjan判连通)
- HDU 1269 迷宫城堡 【强联通分量(模版题)】
- hdu 1269 迷宫城堡【强连通Tarjan】
- hdu 1269 迷宫城堡 - 有向图的连通分量
- hdu 1269 迷宫城堡 强连通分量
- hdu 1269 迷宫城堡 强连通分量模版
- hdu 1269 迷宫城堡(tarjan 算法)
- hdu1269迷宫城堡 (强连通Tarjan+邻接表)
- HDU 1269 迷宫城堡 强连通分量模板题
- HDU1269迷宫城堡连通分量分解
- HDU 1269 迷宫城堡 (Tarjan 算法)
- HDU 1269 迷宫城堡(tarjan强联通分量)
- hdu 1269 迷宫城堡 tarjan算法求有向图的强连通分量
- HDU 1269 迷宫城堡(裸强连通分量,3级)