POJ3694-Network(Tarjan缩点+LCA)
来源:互联网 发布:数据港股票行情 编辑:程序博客网 时间:2024/04/19 16:27
题目链接
题意:给你一个连通图,然后再给你n个询问,每个询问给一个点u,v表示加上u,v之后又多少个桥。
思路:用Tarjan缩点后,形成一棵树,所以树边都是桥了。然后加入边以后,查询LCA,LCA上的桥都减掉。
代码:
#include <iostream>#include <cstdio>#include <cstring>#include <vector>#include <utility>#include <algorithm>using namespace std;const int MAXN = 100005;struct Edge{ int to, next;}edge[MAXN * 5];int head[MAXN], tot;int Low[MAXN], DFN[MAXN];int Index, top;int bridge;int n, m;int f[MAXN], ancestor[MAXN];int find(int x) { return x == f[x] ? x : f[x] = find(f[x]);}bool Union(int a, int b) { int pa = find(a); int pb = find(b); if (pa != pb) { f[pa] = pb; return true; } return false;}void addedge(int u, int v) { edge[tot].to = v; edge[tot].next = head[u]; head[u] = tot++;}void Tarjan(int u, int pre) { int v; Low[u] = DFN[u] = ++Index; for (int i = head[u]; i != -1; i = edge[i].next) { v = edge[i].to; if (v == pre) continue; if (!DFN[v]) { Tarjan(v, u); ancestor[v] = u; if (Low[u] > Low[v]) Low[u] = Low[v]; if (Low[v] > DFN[u]) bridge++; else Union(u, v); } else if (Low[u] > DFN[v]) Low[u] = DFN[v]; }}void init() { memset(head, -1, sizeof(head)); memset(DFN, 0, sizeof(DFN)); tot = 0; Index = top = 0; bridge = 0; memset(ancestor, 0, sizeof(ancestor)); for (int i = 1; i <= n; i++) f[i] = i;}void solve() { for (int i = 1; i <= n; i++) if (!DFN[i]) Tarjan(i, -1);}void lca(int u, int v) { while (u != v) { while (DFN[u] >= DFN[v] && u != v) { if (Union(u, ancestor[u])) bridge--; u = ancestor[u]; } while (DFN[v] >= DFN[u] && u != v) { if (Union(v, ancestor[v])) bridge--; v = ancestor[v]; } }}int main() { int t = 1; while (scanf("%d%d", &n, &m)) { if (n == 0 && m == 0) break; init(); int u, v; for (int i = 0; i < m; i++) { scanf("%d%d", &u, &v); addedge(u, v); addedge(v, u); } solve(); printf("Case %d:\n", t++); int k; scanf("%d", &k); while (k--) { scanf("%d%d", &u, &v); lca(u, v); printf("%d\n", bridge); } printf("\n"); } return 0;}
1 0
- POJ3694-Network(Tarjan缩点+LCA)
- poj3694 Network 【图论-Tarjan-Lca】
- poj3694+hdu2460 求桥+缩点+LCA/tarjan
- POJ3694(tarjan缩点+并查集+LCA)
- poj3694 Network 边双联通缩点+离线LCA
- poj3694--Network(双连通缩点+lca)
- Network(Tarjan+缩点+LCA)
- poj3694 Network 无向图tarjan求桥+LCA
- poj3694 Network Tarjan+树链剖分
- hdu2460&&poj3694 缩点+lca变形
- hdu 2460 Network Tarjan缩点+LCA 解题报告
- poj3694 Network Tarjan(树链剖分)
- [POJ3694]Network(tarjan+链剖)
- POJ3694 Network 割边+LCA
- POJ3694 Network 割边 LCA
- poj3694 LCA+并查集+tarjan求割边
- 【POJ3694】Network {tarjan+并查集}
- Network-POJ3694并查集+LCA
- linux chmod命令
- Quartz 作业调度框架
- Linux下使用V4L2读取获取拍照(获取静态图像)
- android 一个有漂亮动画效果的Dialog
- SQL Server与MySQL中的MD5与SHA1
- POJ3694-Network(Tarjan缩点+LCA)
- D3D11_TEXTURE_ADDRESS_MODE(纹理寻址模式)
- 创建、查询job
- CSDN头版头条 《近匠》 Wijmo 5 CTO:从Web到移动,我的25年编程生涯
- win8 c盘空间清理
- Android4.4 RIL源码分析——RILD的运行过程(Unsolicited)
- 利用freemaker生成静态页面
- 1000内所有偶数的和
- 10-远程到服务器安装visualSVN server,出现Service 'VisualSVN Server' failed to start的解决方法