http://poj.org/problem?id=3694

题意:

给一幅图,若干个操作,每个操作时连接两个点,对于每个操作之后的图判断图中还有几条割边

题解 :  tarjan  + lca ;

//将不是割边上的点缩为一个点,然后统计割边,求添加一条边之后,割边减少了多少,就是从两个点出发
//到达他们最近的公共祖先,他们经过了几条割边,然后减去经过的割边数,就是答案,这里用到了lca
//并查集

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<cmath>
  4 #include<iostream>
  5 #include<algorithm>
  6 #include<set>
  7 #include<map>
  8 #include<queue>
  9 #include<vector>
 10 #include<string>
 11 #define Min(a,b) a<b?a:b
 12 #define Max(a,b) a>b?a:b
 13 #define CL(a,num) memset(a,num,sizeof(a));
 14 #define eps  1e-6
 15 #define inf 10001000
 16 
 17 #define ll   __int64
 18 
 19 #define  read()  freopen("data.txt","r",stdin) ;
 20 #define inf  9999999
 21 using namespace std;
 22 
 23 const double pi  = acos(-1.0);
 24 const int maxn = 100010;
 25 #define N  30
 26 int n , m ;
 27 int dfn[maxn];// 记录 入栈的次序;
 28 int low[maxn];// 记录 最小的 可以到达 的次序
 29 int stack[maxn] ;//栈
 30 int  instack[maxn];//记录 是否在栈中
 31 int num ;//  入栈的次序
 32 int top;  // 栈顶
 33 int  bcnt ;  // 所点的 代表 序号
 34 int belong[maxn];//  记录每个节点所属 的 缩点号;
 35 vector<int>g[maxn] ;
 36 int ans[maxn] ;
 37 int in[maxn],out[maxn] ;
 38 int f[maxn],father[maxn] ;
 39 int cut ;
 40 int find(int x)
 41 {
 42     if(f[x]!=x) f[x] = find(f[x]) ;
 43     return f[x] ;
 44 }
 45 int link(int i,int  j)// 判断是否在同一个 缩点 里面
 46 {
 47     int a = find(i) ;
 48     int b = find(j) ;
 49     if(a!=b)
 50     {
 51         f[a] = b;
 52         return 1 ;
 53     }
 54 
 55     return 0 ;
 56 }
 57 void tarjan(int a,int pre)
 58 {
 59     int j ,i, k;
 60     dfn[a] = low[a]= ++num ;
 61 
 62     stack[++top] = a;
 63     instack[a] = 1 ;
 64     for(i = 0 ; i < g[a].size();i++)
 65     {
 66         int k = g[a][i] ;
 67         if(!dfn[k])
 68         {
 69             tarjan(k,a) ;
 70 
 71             father[k] = a ;
 72 
 73             if(low[a] > low[k]) low[a] = low[k] ;
 74 
 75             if(low[k] > dfn[a])cut ++ ;
 76             else
 77               link(a,k) ; // 将 不是 割边上的点 缩成一个点 ;
 78 
 79         }
 80         else
 81         {
 82             if(k != pre &&instack[k] && dfn[k] < low[a]) low[a] = dfn[k] ;//  这里不能为 父节点
 83         }
 84 
 85     }
 86 
 87 
 88 
 89 }
 90 
 91 void init()
 92 {
 93 
 94     CL(instack,0);
 95     CL(belong,0) ;
 96     CL(dfn,0) ;
 97     CL(low,0) ;
 98     CL(father,0) ;
 99     num = bcnt = top  = 0 ;
100 
101     for(int i = 0 ;i <=n;i++)f[i] = i ;
102 
103 
104 
105 }
106 
107 void  lca(int u,int v)// 最近公共祖先 模版
108 {
109     while(u!=v)
110     {
111 
112         while(dfn[u] > dfn[v] && u!=v)
113         {
114             if(link(u,father[u])) cut--;
115             else  u = father[u] ;
116         }
117         while(dfn[v] > dfn[u]&& u!=v)
118         {
119             if(link(v,father[v])) cut-- ;
120             else v = father[v] ;
121 
122         }
123 
124     }
125 }
126 int  main()
127 {
128     int i ,a,b,t,j,mi,mx;
129     int cas = 0 ;
130     //read() ;
131 
132     while(scanf("%d%d",&n,&m)!=EOF)
133     {
134         if(n == 0&& m == 0) break ;
135 
136         init() ;
137 
138         for(i = 0;i <= n;i++) g[i].clear() ;
139 
140         for(i =0  ; i < m;i++)
141         {
142             scanf("%d%d",&a,&b);
143             g[a].push_back(b);
144             g[b].push_back(a) ;
145         }
146         cut = 0 ;
147         tarjan(1,-1) ;
148         scanf("%d",&t);
149 
150         printf("Case %d:\n",++cas) ;
151         while(t--)
152         {
153             scanf("%d%d",&a,&b);
154             lca(a,b) ;
155 
156             printf("%d\n",cut) ;
157         }
158         printf("\n") ;
159 
160     }
161 
162 }

转载于:https://www.cnblogs.com/acSzz/archive/2012/10/18/2729660.html

poj 3694 Network (无向图的 割边 lca )相关推荐

  1. 【割边缩点】解题报告:POJ - 3694 - Network(Tarjan割边缩点 + LCA + 并查集优化)

    POJ - 3694 - Network 给定一张N个点M条边的无向连通图,然后执行Q次操作,每次向图中添加一条边,并且询问当前无向图中"桥"的数量.N≤105,M≤2∗105,Q ...

  2. POJ - 3694 Network tanjar割边+lca

    题目链接 思路:跑一边tanjar将所有的割边u->v标记为cut[v]=true,表示u->v这条边为割边.然后记录总的割边数ans,每次从两个询问点暴力往上边在跑直到LCA,如果碰到c ...

  3. POJ 3694 Network(tarjan+lca+并查集)

    题目 给定一张NNN个点MMM条边的无向连通图,然后执行QQQ次操作,每次向图中添加一条边,并且询问当前无向图中"桥"的数量. 题解 先求出图中所有的边双,然后缩点 令c[x],c ...

  4. POJ 3694 Network ★(边双连通分量+并查集缩点+LCA)

    [题意]一个无向图可以有重边,下面q个操作,每次在两个点间连接一条有向边,每次连接后整个无向图还剩下多少桥(每次回答是在上一次连边的基础之上) [分析]好题,做完后涨了很多姿势~ 普通做法当然就是每加 ...

  5. POJ - 3694 Network(边双缩点+LCA+并查集优化)

    题目链接:点击查看 题目大意:给出一个由n个点组成的无向图,现在有m次操作,每次操作都会向图中增加一条无向边,每次操作后询问当前图中有多少个桥 题目分析:题意很好理解,思路也很好想,就是代码量有点小多 ...

  6. POJ 3694 Network

    大意:让你求无向图的桥(割边) 思路:一次查询,重建一次图,然后求一次割边,TLE.去网上开了看资料,可以用LCA暴力查询,唔,改天看看LCA. TLE CODE: #include <iost ...

  7. POJ 1144 Network(无向图连通分量求割点)

    题目地址:POJ 1144 求割点.推断一个点是否是割点有两种推断情况: 假设u为割点,当且仅当满足以下的1条 1.假设u为树根,那么u必须有多于1棵子树 2.假设u不为树根.那么(u,v)为树枝边. ...

  8. POJ 1236 Network of Schools(强连通 Tarjan+缩点)

    POJ 1236 Network of Schools(强连通 Tarjan+缩点) ACM 题目地址:POJ 1236 题意:  给定一张有向图,问最少选择几个点能遍历全图,以及最少加入�几条边使得 ...

  9. 【POJ - 3694】Network(对dfn求lca 或 缩点+lca 或 边双连通+并查集)

    题干: 网络管理员管理大型网络.该网络由N台计算机和成对计算机之间的M链路组成.任何一对计算机都通过连续的链接直接或间接连接,因此可以在任何两台计算机之间转换数据.管理员发现某些链接对网络至关重要,因 ...

  10. POJ - 3417 Network LCA+树上差分

    思路:首先来说,给一个树加一条边肯定要构成一个环,我们假设加了该边后产生的环上的每一条边都累计加一. 假设这条边是a到b,那么其实就是原树a->lca(a,b)到b->lca(a,b)上的 ...

最新文章

  1. 具体解释可变參数列表
  2. 线性代数的本质 - 02 - 线性组合、张成的空间与基
  3. GCC的内存边界对齐
  4. mgy最新地址 mgyuser.com
  5. Alink、Tensorflow on Flink 在京东的应用
  6. 全国计算机演示文稿,全国计算机等级考试二级office演示文稿题目[文].pdf
  7. 双向三相交错并联DC-DC变换器
  8. Three.js杂记(十一)—— 精灵与粒子(绘制中国地图)
  9. 手把手教你玩物联网(二)---onenet云平台产品创建
  10. Java多线程实现简易微信发红包
  11. 微信小程序换行 br 无效解决方法
  12. EV4加密转换MP4
  13. N1 从 armbian 刷回 webpad 方法
  14. 看完这篇 教你玩转渗透测试靶机vulnhub——DC3
  15. 安装程序无法继续因为计算机上安,我安装IE7.0的时出现:安装程序无法继续执行,因为在此计算机上检测到IE的更新版本 请问怎么解决...
  16. C# ComboBox禁用滚轮滑动事件
  17. 485无线通信/数传模块_zigbee模块_RS485转ZigBee_顺舟智能
  18. 02 sqlite数据库应用(3)——智力问答测试
  19. java常用类:1。包装类(以Integer类为例)2.String类 3.StringBuffer
  20. iOS math.h 常用数学函数

热门文章

  1. Windows 下安装 SVN 服务器、创建版本库、授权访问
  2. 阶段3 3.SpringMVC·_02.参数绑定及自定义类型转换_4 请求参数绑定集合类型
  3. iview2.0 bug之+8 区的 DatePicker
  4. PL/SQL developer连接远程ORACLE
  5. PHP验证时有用的几段代码
  6. codeforces 711A A. Bus to Udayland(水题)
  7. 第一次点击button, view视图出现;第二次点击button,view视图消失
  8. work of 1/5/2016
  9. [浪风分享]推荐一些不错的计算机书籍
  10. xshell 中使用vim 显示Xmanager运行失败: