51nod 1076 2条不相交的路径(边双连通分量)

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1076

题意:

思路:

边双连通分量,跑一遍存储一下即可。

  1 #include<iostream>
  2 #include<algorithm>
  3 #include<cstring>
  4 #include<cstdio>
  5 #include<sstream>
  6 #include<vector>
  7 #include<stack>
  8 #include<queue>
  9 #include<cmath>
 10 #include<map>
 11 #include<set>
 12 using namespace std;
 13 typedef long long ll;
 14 const int INF = 0x3f3f3f3f;
 15 const int maxn=50000+5;
 16 const int mod=1e9+7;
 17
 18 int n, m;
 19 int tot;
 20 int head[maxn];
 21 int ebbc[maxn],pre[maxn],eccno[maxn],low[maxn];
 22 int ebbc_cnt,dfs_clock;
 23
 24 stack<int> S;
 25
 26 struct node
 27 {
 28     int v,next;
 29 }e[2*maxn];
 30
 31 void addEdge(int u, int v)
 32 {
 33     e[tot].v=v;
 34     e[tot].next=head[u];
 35     head[u]=tot++;
 36 }
 37
 38 int tarjan(int u, int fa)
 39 {
 40     int lowu=pre[u]=++dfs_clock;
 41     S.push(u);
 42     for(int i=head[u];i!=-1;i=e[i].next)
 43     {
 44         int v=e[i].v;
 45         if(!pre[v])
 46         {
 47             int lowv=tarjan(v,u);
 48             lowu=min(lowu,lowv);
 49         }
 50         else if(v!=fa)
 51             lowu=min(lowu,pre[v]);
 52     }
 53     if(pre[u]==lowu)
 54     {
 55         ebbc_cnt++;
 56         for(;;)
 57         {
 58             int tmp=S.top(); S.pop();
 59             eccno[tmp]=ebbc_cnt;
 60             if(tmp==u)  break;
 61         }
 62     }
 63     return low[u]=lowu;
 64 }
 65
 66 void find_ebbc()
 67 {
 68     ebbc_cnt=dfs_clock=0;
 69     memset(pre,0,sizeof(pre));
 70     for(int i=1;i<=n;i++)
 71     {
 72         if(!pre[i])  tarjan(i,-1);
 73     }
 74 }
 75
 76 int main()
 77 {
 78     //freopen("in.txt","r",stdin);
 79     while(~scanf("%d%d",&n,&m))
 80     {
 81         tot=0;
 82         memset(head,-1,sizeof(head));
 83         for(int i=1;i<=m;i++)
 84         {
 85             int u,v;
 86             scanf("%d%d",&u,&v);
 87             addEdge(u,v);
 88             addEdge(v,u);
 89         }
 90         find_ebbc();
 91         int q;
 92         scanf("%d",&q);
 93         while(q--)
 94         {
 95             int u,v;
 96             scanf("%d%d",&u,&v);
 97             if(eccno[u]==eccno[v])  puts("Yes");
 98             else puts("No");
 99         }
100     }
101     return 0;
102 }
时间: 2024-07-29 03:17:30

51nod 1076 2条不相交的路径(边双连通分量)的相关文章

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

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 <=

51nod 1076 2条不相交的路径

思路:强连通,将他变成有向图,并且不能返回父节点 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=30000; 4 5 struct node{ 6 int v,next; 7 }edg[50004*3]; 8 int head[maxn],tot=0; 9 void add(int u,int v){ 10 edg[tot].v=v;edg[tot].next=head[u];head[u]=tot++; 1

Redundant Paths 分离的路径(边双连通分量)

题干: 为了从F(1≤F≤5000)个草场中的一个走到另一个,贝茜和她的同伴们有时不得不路过一些她们讨厌的可怕的树.奶牛们已经厌倦了被迫走某一条路,所以她们想建一些新路,使每一对草场之间都会至少有两条相互分离的路径,这样她们就有多一些选择.每对草场之间已经有至少一条路径.给出所有 R ( F - 1 ≤ R ≤ 10000 )条双向路的描述,每条路连接了两个不同的草场,请计算最少的新建道路的数量, 路径由若干道路首尾相连而成.两条路径相互分离,是指两条路径没有一条重合的道路.但是,两条分离的路径

poj 3177 求至少添加多少条边可以成为边-双连通图(有重边)

[题意]:给出一张无向连通图,求添加多少条边可以成为边-双连通图 [思路]:同3352 一样,求出边-双连通分量,缩点就成了一棵树,求这棵树里的出度为1 的点num  结果是(num-1)/2; 但是!!  这里和3352 哟一点不一样就是这里有重边,当有重边的时候,不同low值的两点可能属于同一个边-双连通分量 所以在构图的时候要注意把重边去掉! 1 #include<iostream> 2 #include<stdio.h> 3 #include<string.h>

hdu 1025 上面n个点与下面n个点对应连线 求最多能连有多少条不相交的线 (LIS)

题目大意有2n个城市,其中有n个富有的城市,n个贫穷的城市,其中富有的城市只在一种资源富有,且富有的城市之间富有的资源都不相同,贫穷的城市只有一种资源贫穷,且各不相同,现在给出一部分贫穷城市的需求,每个需求都是一个贫穷的向一个富有的城市要资源,且每个富有的城市都想向贫穷的城市输入自己富有的那部分资源,现在为了运输要建设多条路,但是路与路之间不允许有交叉,求满足贫穷城市的各种要求最多可以建设多少条路 简化版::上面n个点,下面n个点,然后在这2n个点之间随意连线,一个点只能被连一次,问最多有多少条

HDOJ--3790--最短路径问题(双权值问题)

最短路径问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 18046    Accepted Submission(s): 5413 Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的. Input

vs2013-tfs-疑问之版本控制器路径有双引号解决办法

问题描述: 最近项目:“****”展示交易平台 ,所以版本控制器路径为: 导致生成解决方案提示:路径有问题 解决办法: 1.直接在版本控制器重命名是不支持的,需要安装: Visual Studio Team Foundation Server 2013 Update 2 Power Tools .msi 2.删除项目重新加载绑定即可

算法提高课——图论

图论难点:问题的转化和抽象(可看成特殊的某一类DP) 图论与DP的联系: DP问题(从集合角度分析最优化问题)可以看成从F(0,0).F(0,1).F(1,2)......F(0,m)到F(n,m)的最长路.因此DP问题可以转化为拓扑图(一般DP问题的状态间无环)上的最短(长)路. 当DP依赖关系不具有拓扑序时(即存在环时),可以将其转化为最短路,也可以用高斯消元. //TLE的原因常常是没有memsert //st数组在不同算法中的用法: 单源最短路的建图方式 AcWing 1129. 热浪

Android 各种路径详细说明

说起Android"内部存储",对于开发者而言可以毫不犹豫地脱口而出,不就是/data/data目录嘛,也不尽然,/data/user/0/又如何解释?那说起"外部存储",例如sd卡目录获取值,更是众说纷纭,是/mnt/sdcard?还是/storage/sdcard0?莫非是/storage/emulated/0? 此疑问起源要追溯到笔者在写上一篇博文,即以DexClassLoader类加载原理编写demo实现类替换修复,其中编码过程中涉及到读写Android内外