51Nod-1076-2条不相交的路径
来源:互联网 发布:mac系统怎样翻墙 编辑:程序博客网 时间:2024/06/09 17:58
ACM模版
描述
题解
边双连通问题,使用Tarjan
算法可以KO.。
代码
#include <iostream>#include <algorithm>#include <cstdio>#include <vector>#include <cstring>using namespace std;const int MAXN = 5e4 + 10;int stack[MAXN]; // 每遍历一个点便入栈int top;bool inStack[MAXN]; // 判断某个点是否已经在栈里面// 这两个数组至关重要// dfn[u]为节点u搜索的次序编号(时间戳)// low[u]为u或者u的子树能够追溯到的最早的栈中节点的次序号int dfn[MAXN];int low[MAXN];int beLong[MAXN]; // 判断哪些点联通int Bcnt, Dindex; // 记录强连通个数和当前时间vector<int> v[MAXN]; // 邻接表保存边int N, M, Q;void init(){ Bcnt = Dindex = top = 0; memset(dfn, -1, sizeof(dfn)); memset(inStack, false, sizeof(inStack)); for (int i = 0; i < MAXN; i++) { v[i].clear(); } return ;}void tarjan(int u, int fa){ dfn[u] = low[u] = ++Dindex; stack[++top] = u; inStack[u] = true; // 入队列,置为true int u_size = (int)v[u].size(); for (int i = 0; i < u_size; i++) { int k = v[u][i]; if (dfn[k] == -1) // 没有被访问过 { tarjan(k, u); low[u] = min(low[u], low[k]); } else if (inStack[k] && k != fa) // 被访问过 { low[u] = min(low[u], dfn[k]); } } if (dfn[u] == low[u]) { Bcnt++; int tmp; do { tmp = stack[top--]; beLong[tmp] = Bcnt; inStack[tmp] = false; // 出队列,置为false } while (tmp != u); } return ;}void solve(){ for (int i = 1; i <= N; i++) { if (dfn[i] == -1) // 没有搜索过则搜索 { tarjan(i, -1); } }}int main(int argc, const char * argv[]){ init(); cin >> N >> M; int a, b; for (int i = 0; i < M; i++) { scanf("%d %d", &a, &b); v[a].push_back(b); v[b].push_back(a); } solve(); cin >> Q; while (Q--) { scanf("%d %d", &a, &b); if (beLong[a] == beLong[b]) { printf("Yes\n"); } else { printf("No\n"); } } return 0;}
参考
《图的割点、桥和双连通分支的基本概念》
0 0
- 51nod 1076 2条不相交的路径(tarjan)
- 51Nod-1076-2条不相交的路径
- 51nod 1076 2条不相交的路径【边双连通+染色】
- 51NOD 1076 2条不相交的路径 【点双连通分量】
- 51nod 1076 2条不相交的路径【边双连通分量】
- 51nod 1076 2条不相交的路径【边连通分量】
- 51nod 1076 2条不相交的路径 [双联通]【图论】
- 51 nod 1076 2条不相交的路径(强联通)
- 51nod 1076 2条不相交的路径 tarjan算法
- 51nod 1076 2条不相交的路径(Tarjan,边双连通分量)
- 51nod 1076 2条不相交的路径(边双连通分量)
- 1076 2条不相交的路径
- 51nod-2条不相交的路径(边双联通分量)
- 51nod 1076 2条不相交路径(边双联通分量)
- 1076 2条不相交的路径 双连通分量
- 51nod1076 2条不相交的路径
- 51node 1076 2条不相交的路径 tarjan算法
- 【51nod1076】【2条不相交的路径】【图论】【边双连通分量】
- 分布式搜索Elasticsearch——删除指定索引
- Intent传递对象——Serializable和Parcelable区别
- 网络爬虫——原理简介
- NOIP提高模拟 Binary
- JAVA_Apache_POI操作EXCEL(与第一个sheet相同去重)
- 51Nod-1076-2条不相交的路径
- 2016/8/17 学会学习
- java web整合开发笔记
- 机器学习之k-means算法
- 邮箱验证正则表达式【转载】
- java正则表达式学习
- 多线程问题的总结
- Linux自学笔记(四)注意事项
- 动态规划和贪心算法之背包问题理解