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++;
11 }
12 int dfn[maxn],low[maxn],belong[maxn];
13 bool instack[maxn];
14 int Stack[maxn],index,top,bcnt;
15 set<int >s[maxn];
16 void dfs(int u,int fa)
17 {
18     dfn[u]=low[u]=++index;
19     Stack[++top]=u;
20     instack[u]=true;
21     for(int i=head[u];i!=-1;i=edg[i].next)
22     {
23         int v=edg[i].v;
24         if(!dfn[v]){
25             dfs(v,u);
26             low[u]=min(low[u],low[v]);
27         }else if(instack[v]&&v!=fa) low[u]=min(low[u],dfn[v]);
28     }
29     int v;
30     if(dfn[u]==low[u]){
31         bcnt++;
32         do{
33             v=Stack[top--];
34             instack[v]=false;
35             belong[v]=bcnt;
36           //  s[bcnt].insert(v);
37         }while(u!=v);
38     }
39 }
40 int n,m;
41 void Tarjan()
42 {
43     memset(dfn,0,sizeof(dfn));
44     bcnt = top = index = 0;
45     for(int i=1;i<=n;i++)
46         if(!dfn[i])
47             dfs(i,-1);
48 }
49
50 int main(){
51     int x,y;
52    memset(head,-1,sizeof(head));
53    scanf("%d%d",&n,&m);
54    for(int i=1;i<=m;i++){
55         scanf("%d%d",&x,&y);
56         add(x,y);add(y,x);
57    }
58    Tarjan();
59    //for(int i=1;i<=n;i++) cout<<belong[i]<<endl;
60    int q;
61    scanf("%d",&q);
62    while(q--){
63         scanf("%d%d",&x,&y);
64      //   cout<<belong[x]<<" "<<belong[y]<<" "<<s[belong[x]].size()<<endl;
65         if(belong[x]==belong[y]){
66             cout<<"Yes"<<endl;
67         }
68         else cout<<"No"<<endl;
69    }
70    return 0;
71 }
时间: 2024-10-28 10:04:31

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条不相交的路径(边双连通分量)

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 #in

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

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

Android 各种路径详细说明

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

BZOJ1877 SDOI2009 晨跑 费用流

题意:给定一张有向图,求1到N:1.最多有多少条不相交的路径  2.在第一问的基础上,求所有路径的最小距离和 题解:拆点之后费用流裸题 #include <queue> #include <cstdio> #include <cstring> #include <cstdlib> #include <climits> #include <iostream> #include <algorithm> using namesp

[ CodeVS冲杯之路 ] P1169

不充钱,你怎么AC? 题目:http://codevs.cn/problem/1169/ 感觉这题目好恐怖,莫名其妙乱码一堆就AC了…… 它看上去是两个子问题,实际上可以看成从起点找两条不相交的路径使得经过的数和最大 用 f[i][j][k][l] 表示第一条走到了 (i,j) 第二条走到了 (k,l) 目标状态是 f[n][m-1][n-1][m] 一开始我也没仔细去想,就莫名其妙码了一堆交上去了,本以为会WA,结果A了?! 后面我仔细证明了一下,它是这样的 首先 l 是从 j+1 开始的,这

平面分拆的 Macmahon 公式

首先看一个计数问题:一个边长为 $a\times b\times c$ 的平行六边形,每个内角都是 120 度.用边长为 1 的菱形去覆盖,有多少种不同的方法? 比如下图就是一种: 我们从上方俯视这张图(虽然这是一个平面图形,但是我们想象在空间中鸟瞰它),发现它很像是在墙角堆箱子:在一个边长为 $a\times b\times c$ 的长方体空间中堆放若干形状为单位正方体的 "箱子".不仅如此,箱子堆放的规则是有限制的:紧贴墙角处的那一摞箱子最高,从墙角向外,箱子的高度是递减的.这个规

动态规划 Dynamic Programming

March 26, 2013 作者:Hawstein 出处:http://hawstein.com/posts/dp-novice-to-advanced.html 声明:本文采用以下协议进行授权: 自由转载-非商用-非衍生-保持署名|Creative Commons BY-NC-ND 3.0 ,转载请注明作者及出处. 前言 本文翻译自TopCoder上的一篇文章: Dynamic Programming: From novice to advanced ,并非严格逐字逐句翻译,其中加入了自己的

HDU 3376 费用流 Matrix Again

咳咳,内个,内什么,白书上的费用流模板没过,后来换了种存图方式才过. 题意: 给出一个n × n的矩阵,每个格子中有一个数字代表权值,找出从左上角出发到右下角的两条不相交的路径(起点和终点除外),使得两条路径权值之和最大. 分析: 如果n比较小的话是可以DP的,但是现在n非常大,DP会超时的. 这个用费用流来求解: 因为每个点只能走一次,所以先拆点,两点之间连一条容量为1费用为对应格子权值的边,如果是起点或终点,因为要走两次,所以要连容量为2的边. 对于不同格子之间,如果能到达,连一条容量为IN