51nod 1076 2条不相交路径(边双联通分量)
2017-04-13 00:58
387 查看
题目要求从S到T是否有两条“不相交的路径”,意味着S到T中间没有必经之路,这样才可以做到两条不相交的路径。
那么这个问题就变成了,从S到T,路上是否有桥
在同一个边双联通分量中,每两个点之间都有不唯一的路径相互可达,也就意味着没有桥。
所以只要用dfs处理出所有的边双联通分量,对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; }
相关文章推荐
- [51nod] 1076 2条不相交的路径 #边双联通分量
- 51nod 1076 2条不相交的路径【边连通分量】
- 51nod 1076 2条不相交的路径 [双联通]【图论】
- 51nod-2条不相交的路径(边双联通分量)
- 51nod 1076 2条不相交的路径(tarjan)
- 51Nod-1076-2条不相交的路径
- 51nod 1076 2条不相交的路径【边双连通分量】
- 51nod 1076 2条不相交的路径
- 51nod 1076 2条不相交的路径
- 51nod 1076 2条不相交的路径(Tarjan,边双连通分量)
- 51NOD 1076 2条不相交的路径 【点双连通分量】
- AC日记——2条不相交的路径 51nod 1076
- 51 nod 1076 2条不相交的路径(强联通)
- 51nod 1076 2条不相交的路径(边双连通分量)
- 51nod 1076 2条不相交的路径【边双连通+染色】
- 51nod 1076 2条不相交的路径(边双连通分量)
- 51nod 1076 2条不相交的路径 tarjan算法
- 1076 2条不相交的路径 双连通分量
- 1076 2条不相交的路径
- 1076 2条不相交的路径