51nod1076(边双联通分量)

2024-02-02 22:08
文章标签 分量 联通 边双 51nod1076

本文主要是介绍51nod1076(边双联通分量),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

链接:点击打开链接

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

代码:

#include <queue>
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int siz=50005;
struct node{int to,id;
};
vector<node> G[siz];
int low[siz],dfn[siz],sig[siz],vis[siz];
void dfs(int s,int fa,int id){int i,tmp;vis[s]=1;dfn[s]=low[s]=id++;for(i=0;i<G[s].size();i++){tmp=G[s][i].to;if(vis[tmp]==0){dfs(tmp,s,id);low[s]=min(low[s],low[tmp]);if(low[tmp]>dfn[s])sig[G[s][i].id]=1;}else if(tmp!=fa)low[s]=min(low[s],dfn[tmp]);}
}
void cal(int s,int id){int i,tmp;vis[s]=id;for(i=0;i<G[s].size();i++){tmp=G[s][i].to;if(vis[tmp]||sig[G[s][i].id])continue;cal(tmp,id);}
}                                               //先跑出所有桥,再dfs标记一下,实现
int main(){                                     //边双联通分量int n,m,i,j,u,v,q,id;while(scanf("%d%d",&n,&m)!=EOF){for(i=1;i<=n;i++)G[i].clear();for(i=1;i<=m;i++){scanf("%d%d",&u,&v);G[u].push_back((node){v,i});G[v].push_back((node){u,i});}memset(vis,0,sizeof(vis));memset(sig,0,sizeof(sig));id=1;for(i=1;i<=n;i++){                      //注意一下初始图可能不连通if(vis[i]==0)dfs(i,-1,id);}           id=1;memset(vis,0,sizeof(vis));for(i=1;i<=n;i++){if(vis[i]==0){cal(i,id);id++;}}scanf("%d",&q);while(q--){scanf("%d%d",&u,&v);if(vis[u]==vis[v])puts("Yes");elseputs("No");}}return 0;
}

这篇关于51nod1076(边双联通分量)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/672107

相关文章

线性因子模型 - 独立分量分析(ICA)篇

序言 线性因子模型是数据分析与机器学习中的一类重要模型,它们通过引入潜变量( latent variables \text{latent variables} latent variables)来更好地表征数据。其中,独立分量分析( ICA \text{ICA} ICA)作为线性因子模型的一种,以其独特的视角和广泛的应用领域而备受关注。 ICA \text{ICA} ICA旨在将观察到的复杂信号

【造轮子】纯C++实现的联通组件标记算法

学习《OpenCV应用开发:入门、进阶与工程化实践》一书 做真正的OpenCV开发者,从入门到入职,一步到位! 连接组件标记算法 连接组件标记算法(connected component labeling algorithm-CCL)是图像分析中最常用的算法之一,算法的实质是扫描一幅图像的每个像素,对于像素值相同的分为相同的组(group),最终得到图像中所有的像素连通组件。扫描的方式可以是从

【HDU】2242 考研路茫茫——空调教室 双连通分量+树型DP

考研路茫茫——空调教室 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1978    Accepted Submission(s): 576 Problem Description 众所周知,HDU的考研教室是没

强连通分量专题总结

~~~~~      总题单链接 ~~~~~      对于只需要考虑强连通分量的题,就可以用强连通分量(大雾 ~~~~~      我想了很久,确实没有什么好说的 … \ldots …

图论 求有向图的所有强连通分量 kosaraju算法

一、问题 如何找到有向图(a)中的所有强连通分量,如图(b)    二、kosaraju算法 Kosaraju的算法(又称为–Sharir Kosaraju算法)是一个线性时间(linear time)算法找到的有向图的强连通分量。   1. 原理 它利用了一个事实,逆图(与各边方向相同的图形反转, transpose graph)有相同的强连通分量的原始图。   2. 逆图

【Redundant Paths】【无向图】【双连通分量】【缩点】

Redundant Paths Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit  Status In order to get from one of the  F(1≤F≤5,000)  grazing fields (which a

HIHO #1190 : 连通性·四(点的双联通分量)

题目链接 点的双联通分量,不注意写出了一个bug,找了2个多小时= =,我的边存的是0开始的,然后ans数组一开始也是0,然后就是if的地方。。。。。 还是tarjan的算法,结合提示,这里需要存边,然后栈里面保存的是边,而不是点,这里我用边在边集es中的编号,作为边的标志 #include<bits/stdc++.h>using namespace std;#define cl(a,b

HIHO #1184 : 连通性二·边的双连通分量

题目链接 Tarjan算法,介绍可以看题目讲解,很好很清楚 无向图边的双联通分量的定义:对于一个无向图的子图,当删除其中任意一条边后,不改变图内点的连通性,这样的子图叫做边的双连通子图。而当子图的边数达到最大时,叫做边的双连通分量。 或者说,对于一个连通图,如果任意两点至少存在两条”边不重复”的路径。也就是要去每条边至少在一个简单的环中,也就是说所有的边都不是桥 同样是2个方法: 1)题

poj 2942 Knights of the Round Table(双连通分量+tarjan+二分图判定)

http://poj.org/problem?id=2942 题意: 有N个骑士,给出某些骑士之间的仇恨关系,骑士们开会时会围坐在一个圆桌旁。一次会议能够顺利举行,要满足两个条件: 1:任意相互憎恨的两个骑士不能相邻 2:开会人数为大于2的奇数 若某个骑士任何会议都不能参加,那么就必须将他踢出,给出骑士之间的仇恨关系,问最少需要踢出多少个骑士? 思路: 题目要求踢出的人最少,那

poj 2186 Popular Cows(tarjan + 强连通分量 + 缩点)

http://poj.org/problem?id=2186 题意:有n头牛,m个膜拜关系,膜拜关系是不可逆的而且是单向传递的,比如A膜拜B,B膜拜C,那么A也膜拜C,但B不一定膜拜A。最后问有多少头牛满足条件:除了它自己,其他所有的牛都膜拜它。 思路: 问题可以抽象为:给定一个有向图,n个顶点,m条有向边,有多少个顶点满足:其他所有的点都能到达该点。 首先假如图G是一个有向树