51nod 1076 2条不相交路径(边双联通分量)
来源:互联网 发布:java权限管理如何实现 编辑:程序博客网 时间:2024/06/05 01:11
题目要求从S到T是否有两条“不相交的路径”,意味着S到T中间没有必经之路,这样才可以做到两条不相交的路径。
那么这个问题就变成了,从S到T,路上是否有桥
在同一个边双联通分量中,每两个点之间都有不唯一的路径相互可达,也就意味着没有桥。
所以只要用dfs处理出所有的边双联通分量,对S和T判断一下是否在同一个边双联通分量即可。
#include<iostream>#include<string.h>#include<string>#include<algorithm>#include<stdio.h>#include<vector>using namespace std;const int maxn = 26000;struct Edge{ int u,v; bool bri; Edge(){} Edge(int uu,int vv) { u = uu; v = vv; bri = false; }};int dfn[maxn];int low[maxn];bool vis[maxn];int dfs_clock = 0;int n,m;vector<Edge> G[maxn];int bcn[maxn];void init(){ dfs_clock = 0; memset(vis,0,sizeof(vis)); memset(dfn,0,sizeof(dfn)); memset(low,0,sizeof(low)); memset(G,0,sizeof(G)); memset(bcn,0,sizeof(bcn));}void dfs_1(int u,int fa){ dfn[u] = low[u] = ++dfs_clock; vis[u] = 1; for(int i = 0;i<G[u].size();i++) { int v = G[u][i].v; if(vis[v] == 0) { dfs_1(v,u); low[u] = min(low[u],low[v]); if(low[v]>dfn[u]) { G[u][i].bri = true; } } else if(vis[v] == 1 && v != fa) { low[u] = min(low[u],dfn[v]); } }}int read(){int x=0,c=getchar(),f=1;while(c<48){if(c=='-')f=-1;c=getchar();}while(c>47)x=x*10+c-48,c=getchar();return x*f;}void dfs_2(int u,int id){ if(vis[u] == 1) return; vis[u] = 1; bcn[u] = id; for(int i = 0;i<G[u].size();i++) { int v = G[u][i].v; if(G[u][i].bri == 1) continue; if(vis[v] == 1) continue; dfs_2(v,id); }}int main(){ while(cin>>n>>m) { init(); for(int i = 0;i<m;i++) { int u,v; u = read(); v = read(); G[u].push_back(Edge(u,v)); G[v].push_back(Edge(v,u)); } for(int i = 1;i<=n;i++) { if(vis[i] == 0) dfs_1(i,-1); } memset(vis,0,sizeof(vis)); int id = 0; for(int i = 1;i<=n;i++) { if(!vis[i]) dfs_2(i,++id); } int q; scanf("%d",&q); for(int i = 0;i<q;i++) { int a,b; a = read(); b = read(); if(bcn[a] == bcn[b]) puts("Yes"); else puts("No"); } } return 0;}
0 0
- 51nod 1076 2条不相交路径(边双联通分量)
- 51nod-2条不相交的路径(边双联通分量)
- 51nod 1076 2条不相交的路径 [双联通]【图论】
- 51nod 1076 2条不相交的路径【边连通分量】
- 51 nod 1076 2条不相交的路径(强联通)
- 51nod 1076 2条不相交的路径(Tarjan,边双连通分量)
- 51nod 1076 2条不相交的路径(边双连通分量)
- 51nod 1076 2条不相交的路径(tarjan)
- 51nod 1076 2条不相交的路径【边双连通+染色】
- 51nod 1076 2条不相交的路径【边双连通分量】
- 51Nod-1076-2条不相交的路径
- 51NOD 1076 2条不相交的路径 【点双连通分量】
- 51nod 1076 2条不相交的路径 tarjan算法
- 1076 2条不相交的路径
- 1076 2条不相交的路径 双连通分量
- 51nod1076 2条不相交的路径
- 51node 1076 2条不相交的路径 tarjan算法
- 51Nod-1811-联通分量计数
- HTML常用table样式
- MySQL表优化
- 第六章 JAVA方法初级学习
- 初识 Git
- linux初学 unit13 练习
- 51nod 1076 2条不相交路径(边双联通分量)
- 确定比赛名次 【拓扑】
- getCurrentSession()报Could not obtain transaction-synchronized Session for current thread错误
- lightoj1095 Arrange the Numbers 组合数学
- mysql explain用法
- 科锐课堂笔记:2017/4/12 单例模式与运算符重载
- getClass(),class属性和getName()解析
- 重载和重写的区别?
- Allegro的模块化设计