poj 3694 Network (无向图的 割边 lca )
题意:
题解 : tarjan + lca ;
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 )相关推荐
- 【割边缩点】解题报告:POJ - 3694 - Network(Tarjan割边缩点 + LCA + 并查集优化)
POJ - 3694 - Network 给定一张N个点M条边的无向连通图,然后执行Q次操作,每次向图中添加一条边,并且询问当前无向图中"桥"的数量.N≤105,M≤2∗105,Q ...
- POJ - 3694 Network tanjar割边+lca
题目链接 思路:跑一边tanjar将所有的割边u->v标记为cut[v]=true,表示u->v这条边为割边.然后记录总的割边数ans,每次从两个询问点暴力往上边在跑直到LCA,如果碰到c ...
- POJ 3694 Network(tarjan+lca+并查集)
题目 给定一张NNN个点MMM条边的无向连通图,然后执行QQQ次操作,每次向图中添加一条边,并且询问当前无向图中"桥"的数量. 题解 先求出图中所有的边双,然后缩点 令c[x],c ...
- POJ 3694 Network ★(边双连通分量+并查集缩点+LCA)
[题意]一个无向图可以有重边,下面q个操作,每次在两个点间连接一条有向边,每次连接后整个无向图还剩下多少桥(每次回答是在上一次连边的基础之上) [分析]好题,做完后涨了很多姿势~ 普通做法当然就是每加 ...
- POJ - 3694 Network(边双缩点+LCA+并查集优化)
题目链接:点击查看 题目大意:给出一个由n个点组成的无向图,现在有m次操作,每次操作都会向图中增加一条无向边,每次操作后询问当前图中有多少个桥 题目分析:题意很好理解,思路也很好想,就是代码量有点小多 ...
- POJ 3694 Network
大意:让你求无向图的桥(割边) 思路:一次查询,重建一次图,然后求一次割边,TLE.去网上开了看资料,可以用LCA暴力查询,唔,改天看看LCA. TLE CODE: #include <iost ...
- POJ 1144 Network(无向图连通分量求割点)
题目地址:POJ 1144 求割点.推断一个点是否是割点有两种推断情况: 假设u为割点,当且仅当满足以下的1条 1.假设u为树根,那么u必须有多于1棵子树 2.假设u不为树根.那么(u,v)为树枝边. ...
- POJ 1236 Network of Schools(强连通 Tarjan+缩点)
POJ 1236 Network of Schools(强连通 Tarjan+缩点) ACM 题目地址:POJ 1236 题意: 给定一张有向图,问最少选择几个点能遍历全图,以及最少加入�几条边使得 ...
- 【POJ - 3694】Network(对dfn求lca 或 缩点+lca 或 边双连通+并查集)
题干: 网络管理员管理大型网络.该网络由N台计算机和成对计算机之间的M链路组成.任何一对计算机都通过连续的链接直接或间接连接,因此可以在任何两台计算机之间转换数据.管理员发现某些链接对网络至关重要,因 ...
- POJ - 3417 Network LCA+树上差分
思路:首先来说,给一个树加一条边肯定要构成一个环,我们假设加了该边后产生的环上的每一条边都累计加一. 假设这条边是a到b,那么其实就是原树a->lca(a,b)到b->lca(a,b)上的 ...
最新文章
- 具体解释可变參数列表
- 线性代数的本质 - 02 - 线性组合、张成的空间与基
- GCC的内存边界对齐
- mgy最新地址 mgyuser.com
- Alink、Tensorflow on Flink 在京东的应用
- 全国计算机演示文稿,全国计算机等级考试二级office演示文稿题目[文].pdf
- 双向三相交错并联DC-DC变换器
- Three.js杂记(十一)—— 精灵与粒子(绘制中国地图)
- 手把手教你玩物联网(二)---onenet云平台产品创建
- Java多线程实现简易微信发红包
- 微信小程序换行 br 无效解决方法
- EV4加密转换MP4
- N1 从 armbian 刷回 webpad 方法
- 看完这篇 教你玩转渗透测试靶机vulnhub——DC3
- 安装程序无法继续因为计算机上安,我安装IE7.0的时出现:安装程序无法继续执行,因为在此计算机上检测到IE的更新版本 请问怎么解决...
- C# ComboBox禁用滚轮滑动事件
- 485无线通信/数传模块_zigbee模块_RS485转ZigBee_顺舟智能
- 02 sqlite数据库应用(3)——智力问答测试
- java常用类:1。包装类(以Integer类为例)2.String类 3.StringBuffer
- iOS math.h 常用数学函数
热门文章
- Windows 下安装 SVN 服务器、创建版本库、授权访问
- 阶段3 3.SpringMVC·_02.参数绑定及自定义类型转换_4 请求参数绑定集合类型
- iview2.0 bug之+8 区的 DatePicker
- PL/SQL developer连接远程ORACLE
- PHP验证时有用的几段代码
- codeforces 711A A. Bus to Udayland(水题)
- 第一次点击button, view视图出现;第二次点击button,view视图消失
- work of 1/5/2016
- [浪风分享]推荐一些不错的计算机书籍
- xshell 中使用vim 显示Xmanager运行失败: