1076 2条不相交的路径
基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题

 收藏
 关注

给出一个无向图G的顶点V和边E。进行Q次查询,查询从G的某个顶点V[s]到另一个顶点V[t],是否存在2条不相交的路径。(两条路径不经过相同的边)

(注,无向图中不存在重边,也就是说确定起点和终点,他们之间最多只有1条路)

Input
第1行:2个数M N,中间用空格分开,M是顶点的数量,N是边的数量。(2 <= M <= 25000, 1 <= N <= 50000)
第2 - N + 1行,每行2个数,中间用空格分隔,分别是N条边的起点和终点的编号。例如2 4表示起点为2,终点为4,由于是无向图,所以从4到2也是可行的路径。
第N + 2行,一个数Q,表示后面将进行Q次查询。(1 <= Q <= 50000)
第N + 3 - N + 2 + Q行,每行2个数s, t,中间用空格分隔,表示查询的起点和终点。
Output
共Q行,如果从s到t存在2条不相交的路径则输出Yes,否则输出No。
Input示例
4 4
1 2
2 3
1 3
1 4
5
1 2
2 3
3 1
2 4
1 4
Output示例
Yes
Yes
Yes
No
No

直接构图套强联通分量的模板  然后看询问的两个点是否联通一开始数组开小了 然后最后3个答案一直WA找了半天简直毒瘤啊...
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <vector>
#include <iomanip>
#include <math.h>
#include <map>
using namespace std;
#define FIN     freopen("input.txt","r",stdin);
#define FOUT    freopen("output.txt","w",stdout);
#define INF     0x3f3f3f3f
#define INFLL   0x3f3f3f3f3f3f3f
#define lson    l,m,rt<<1
#define rson    m+1,r,rt<<1|1
typedef long long LL;
typedef pair<int, int> PII;
using namespace std;const int MX = 1e5 + 10;struct Edge {int u, v, nxt;
} E[MX];
int Head[MX], erear;
void edge_init() {erear = 0;memset(Head, -1, sizeof(Head));
}
void edge_add(int u, int v) {E[erear].u = u;E[erear].v = v;E[erear].nxt = Head[u];Head[u] = erear++;
}
int n, m, IN[MX], cnt[MX], val[MX];
int bsz, ssz, dsz;
int Low[MX], DFN[MX];
void Init_tarjan(int n) {bsz = ssz = dsz = 0;for(int i = 1; i <= n; ++i) Low[i] = DFN[i] = 0;
}int Stack[MX], inStack[MX], Belong[MX];
void trajan(int u, int e) {inStack[u] = 1;Stack[++ssz] = u;DFN[u] = Low[u] = ++dsz;for(int i = Head[u]; ~i; i = E[i].nxt) {int v = E[i].v;if((i ^ 1) == e) continue;if(!DFN[v]) {trajan(v, i);Low[u] = min(Low[u], Low[v]);} else if(inStack[v]) {Low[u] = min(Low[u], Low[v]);}}if(DFN[u] == Low[u]) {bsz++; int v;do {v = Stack[ssz--];inStack[v] = 0;Belong[v] = bsz;} while(ssz && v != u);}
}
void tarjan_solve(int n) {dsz = bsz = ssz = 0;memset(DFN, 0, sizeof(DFN));for(int i = 1; i <= n; i++) {if(!DFN[i]) trajan(i, -1);}/*缩点*/edge_init();for(int i = 0; i < 2 * m; i += 2) {int u = E[i].u, v = E[i].v;u = Belong[u]; v = Belong[v];if(u == v) continue;edge_add(u, v);edge_add(v, u);}
}int main() {//FINint m, n;while(~scanf("%d%d", &m, &n)) {edge_init();for(int i = 1; i <= n; i++) {int u, v;scanf("%d%d", &u, &v);edge_add(u, v);edge_add(v, u);}tarjan_solve(n);int Q;scanf("%d", &Q);for(int i = 1; i <= Q; i++) {int u, v;scanf("%d%d", &u, &v);if(Belong[u] == Belong[v]) printf("Yes\n");else printf("No\n");}}return 0;
}

  

转载于:https://www.cnblogs.com/Hyouka/p/7407255.html

51nod 1076 2条不相交的路径 无向图强联通分量 trajan算法相关推荐

  1. 无向图强联通分量-洛谷 P2860 [USACO06JAN]冗余路径Redundant Paths

    https://www.luogu.org/problem/show?pid=2860 这个就是无向图的强联通: 有向图的两点再一个分量里,是x可以到y,y也可到x: 但无向图本来就是双向的,所以我们 ...

  2. 【51nod - 1076】2条不相交的路径(Tarjan无向图判环)

    题干: 给出一个无向图G的顶点V和边E.进行Q次查询,查询从G的某个顶点V[s]到另一个顶点V[t],是否存在2条不相交的路径.(两条路径不经过相同的边) (注,无向图中不存在重边,也就是说确定起点和 ...

  3. 关于有向图强连通分量 和 无向图双联通分量的理解

    有向图的强连通分量 1.强连通 代表的是 这个连通块中的每两个点互相都是有一条路径是可以走到的 2.分量 就是子图: 从这张图上可以看出 A B C这三个点都是互相可以走到的 所以他们就是一个联通块 ...

  4. 『Tarjan算法 无向图的双联通分量』

    无向图的双连通分量 定义:若一张无向连通图不存在割点,则称它为"点双连通图".若一张无向连通图不存在割边,则称它为"边双连通图". 无向图图的极大点双连通子图被 ...

  5. LGV - 求多条不相交路径的方案数

    推荐博客 : https://blog.csdn.net/qq_25576697/article/details/81138213 链接:https://www.nowcoder.com/acm/co ...

  6. 一个机器人位于m x n网格的左上角达到网格的右下角,有多少条不同的路径?

    一个机器人位于m x n网格的左上角(起始点标记为Start). 机器人每次只能向下或向右移动一步.机器人试图达到网格的右下角(标记为Finish). 有多少条不同的路径? Start 1 1 1 2 ...

  7. 【网络流24题】 No.3 最小路径覆盖问题 (网络流|匈牙利算法 -最大二分匹配)...

    [题意] 给定有向图 G=(V,E).设 P 是 G 的一个简单路(顶点不相交) 的集合.如果 V 中每个 顶点恰好在 P 的一条路上,则称 P 是 G 的一个路径覆盖. P 中路径可以从 V 的任何 ...

  8. 大白书中无向图的点双联通分量(BCC)模板的分析与理解

    对于一个无向图,如果任意两点至少存在两条点不重复(除起点和终点外无公共点)的路径,则这个图就是点双联通. 这个要求等价于任意两条边都存在于一个简单环(即同一个点不能在圈中出现两次)中,即内部无割点. ...

  9. 【数据结构与算法】之深入解析“不同路径II”的求解思路与算法示例

    一.题目要求 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 "Start" ),机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在下图中标记 ...

  10. 为什么a*算法采用哈密尔顿距离作为启发函数比不在位数为启发函数的性能要好?_【论文研读】路径规划中的Hybrid A*算法...

    本文目的 由于在carla-autoware的示例中使用了hybrid A* 算法,所以本文基于以下两篇文章对hybrid A* 算法过程进行整理:(文中挑选了一些个人认为便于理解算法的图片,均来自于 ...

最新文章

  1. 三大新兴力量,引领中国消费新经济丨图媒体
  2. Mysql数据库开发的36条原则
  3. 发送JSON数据给服务器
  4. 简而言之,JUnit:测试隔离
  5. 在CentOS7阿里云服务器部署ThinkPHP5,并配置phpstrom实现同步开发(微信小程序及管理员后端)...
  6. RabbitMQ ACK 机制的意义
  7. 用C语言实现猜单词的小游戏
  8. k8s 命令 重启_k8s基本命令
  9. java线程-synchronized实现可见性代码
  10. python做自动化控制postman_Python自动化学习笔记(1)认识接口测试以及postman、Charles工具简单应用...
  11. 幼儿抽象逻辑思维举例_四个锻炼幼儿推理能力的小游戏,让孩子的逻辑思维更上一层楼...
  12. 机器学习/深度学习常用库的配置及其适用的算法总结
  13. 计算机本科结题验收报告怎么写,课题结题鉴定书
  14. 一文详解 TCP/IP 协议
  15. html视频设置自动播放下一个,在html5中,如何使用video标签让两个不同的视频文件按顺序自动播放?...
  16. Android 扫一扫功能 二维码 条形码
  17. 微软企业邮箱邮箱服务器地址,微软Outlook添加网易企业邮箱设置步骤
  18. Halcon contour相关操作
  19. Bitmap的getpixel(x,y)和保存到系统图库的方法
  20. python Exception happened during processing of request from( 127.0.0.1 xxx) error [10053]

热门文章

  1. TH75 V2 双模蓝牙5.2热插拔PCB
  2. 小程序-e.detail.value动态获取input的value
  3. Google Earth Engine APPS(GEE)——使用 AREA2 和 CODED 估算森林砍伐和退化面积(第 1 部分:运行 CODED)
  4. matlab中princ,基于MATLAB_SIMLINK的Turbo交织器的仿真实现
  5. 路由器获取不到ipv6地址
  6. 数据挖掘—GEO,TCGA,Oncomine联合(三)GEO数据的下载和数据质量分析
  7. 计算机编程不等于符号,不等于符号(java)
  8. 【Matlab综合设计】开环Buck-Boost升压-降压式变换器Simulink仿真(含仿真模块选择和参数计算过程)
  9. 计算机考专硕还是学硕好呢,2021计算机考研选学硕还是专硕?
  10. 计算机二级题库删去哪套,Word标题前出现黑块究竟要怎么删除