(连通图)Network--POJ--3694
链接:
http://poj.org/problem?id=3694
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82833#problem/D
这部分学的不是很好,还需要努力!
代码:
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
#define N 100005 struct Edage{int v, next, used;} e[N<<]; int low[N], dfn[N], Head[N], fa[N], Time, cnt;
int IsBridge[N], nbridge; void Init(int n)
{
nbridge = Time = cnt = ; for(int i=; i<=n; i++)
{
Head[i] = -;
dfn[i] = ;
IsBridge[i] = ;
}
}
void Add(int u, int v)
{
e[cnt].v = v;
e[cnt].next = Head[u];
e[cnt].used = false;
Head[u] = cnt++;
}
void Tarjan(int u, int father)
{
int v; fa[u] = father;
low[u] = dfn[u] = ++Time; for(int j=Head[u]; j!=-; j=e[j].next)
{
if(!e[j].used)
{
e[j].used = e[j^].used = true;
v = e[j].v;
if(!dfn[v])
{
Tarjan(v, u);
low[u] = min(low[u], low[v]); if(low[v]>dfn[u])
{
IsBridge[v] = true;
nbridge++;
}
}
else
low[u] = min(low[u], dfn[v]);
}
}
}
void LCA(int u, int v)
{
if(dfn[u]<dfn[v])
swap(u, v); while(dfn[u] > dfn[v])
{
if(IsBridge[u]) nbridge--;
IsBridge[u] = false;
u = fa[u];
} while(u!=v)
{
if(IsBridge[u]) nbridge--;
if(IsBridge[v]) nbridge--;
IsBridge[u] = IsBridge[v] = false;
u = fa[u], v = fa[v];
}
} int main()
{
int n, m, k=;
while(scanf("%d%d", &n, &m), n+m)
{
int i, u, v; Init(n);
for(i=; i<m; i++)
{
scanf("%d%d", &u, &v);
Add(u, v);
Add(v, u);
} Tarjan(, ); printf("Case %d:\n", k++);
scanf("%d", &m);
for(i=; i<m; i++)
{
scanf("%d%d", &u, &v);
LCA(u, v);
printf("%d\n", nbridge);
}
printf("\n");
}
return ;
}
代码:
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
#include <cmath>
#include <stack>
#include <cstring>
usingnamespace std;
#define INF 0xfffffff
#define min(a,b) (a<b?a:b)
#define maxn 100005
int m, n, Time, ans;
int dfn[maxn], low[maxn], Father[maxn], bridge[maxn];
vector<int> G[maxn]; void init()
{
memset(dfn, , sizeof(dfn));
memset(low, , sizeof(low));
memset(bridge, , sizeof(bridge));
memset(Father, , sizeof(Father));
Time = ans = ; for(int i=; i<=n; i++)
G[i].clear();
} void Tarjan(int u,int fa)
{
dfn[u] = low[u] = ++Time;
Father[u] = fa;
int len = G[u].size(), v; for(int i=; i<len; i++)
{
v = G[u][i]; if( !low[v] )
{
Tarjan(v, u);
low[u] = min(low[u], low[v]); if(dfn[u] < low[v])
{
bridge[v] ++;
ans ++;
}
}
elseif(v != fa)
{
low[u] = min(low[u], dfn[v]); if(dfn[u] < low[v])
{
bridge[v] ++;
ans --;
}
} }
}
void Lca(int a,int b)
{
if(a == b)
return ; if(dfn[a] > dfn[b])
{
if( bridge[a] == )
{
bridge[a] = ;
ans --;
}
Lca(Father[a], b);
}
else
{
if(bridge[b] == )
{
bridge[b] = ;
ans --;
}
Lca(a, Father[b]);
}
} int main()
{
int cas = ;
while(scanf("%d %d",&n, &m), m+n)
{
int Q, a, b;
init();
while(m --)
{
scanf("%d %d",&a, &b);
G[a].push_back(b);
G[b].push_back(a);
} scanf("%d", &Q);
Tarjan(, );
// printf("%d\n", ans);
printf("Case %d:\n", cas ++);
while(Q --)
{
scanf("%d %d",&a, &b);
Lca(a, b);
printf("%d\n", ans);
}
}
return0;
}
/* 4 4
1 2
2 1
2 3
1 4
2
1 2
3 4 */
(连通图)Network--POJ--3694的更多相关文章
- Network POJ - 3694(lca并查集+连通图求桥)
就是求出原先图中的桥的数量,在每一次询问时加入一条新边,求加入当前边后图中剩余的桥的数量 求出原先图中的桥的数量,然后减去新加入边的两端点之间的桥的数量,就是剩余桥的数量.. 用并查集把属于同一集合的 ...
- [kuangbin带你飞]专题九 连通图D - Network POJ - 3694
这道题其实也非常简单,只是在求割边及其个数的情况下,每次往里面加入新的边,并再次计算割边的个数. 我们用tarjan可以求出原图的桥以及个数,当然我们不能暴力加边,然后求解,那么如何求呢??? 其实非 ...
- Network POJ - 3694 无向图找桥
题意: 给你一个无向图,你需要找出来其中有几个桥 桥: 1.存在重边必定不为桥 2.low[v]>dfn[u] 代码: //题意很清晰 //就是这个需要先找出来原无向图中的桥个数,然后在判断添加 ...
- Network POJ - 3694 (连通图标求桥)
有上述两个数组定义可知:对于某点root,其有一儿子v,则有: 1. 如果dfn[root]<=low[v]此点是割点(对于dfs树的根,即最初节点需要两个儿子才是割点) 2. ...
- Network POJ - 3694 (LCA+tarjan+桥)
题目链接:https://vjudge.net/problem/POJ-3694 具体思路:首先可以通过缩点的方式将整个图变成一个树,并且树的每条边是桥,但是我们可以利用dfn数组将整个图变成树,这样 ...
- Poj 3694 Network (连通图缩点+LCA+并查集)
题目链接: Poj 3694 Network 题目描述: 给出一个无向连通图,加入一系列边指定的后,问还剩下多少个桥? 解题思路: 先求出图的双连通分支,然后缩点重新建图,加入一个指定的边后,求出这条 ...
- POJ 3694——Network——————【连通图,LCA求桥】
Network Time Limit:5000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Stat ...
- 【POJ 3694】 Network(割边<桥>+LCA)
[POJ 3694] Network(割边+LCA) Network Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 7971 ...
- Tarjan算法各种&RMQ& POJ 3694
关于tarjan 的思想可以在网上搜到,具体我也不太清楚,应该说自己理解也不深,下面是做题经验得到的一些模板. 其中有很多转载,包括BYVoid等,感谢让我转...望各路大神愿谅 有向图求连通分量的一 ...
- A - Wireless Network POJ - 2236-kuangbin带你飞
A - Wireless Network POJ - 2236 Time Limit: 10000MS Memory Limit: 65536K Total Submissions: 50348 ...
随机推荐
- linux多路径配置
一.什么是多路径 普通的电脑主机都是一个硬盘挂接到一个总线上,这里是一对一的关系.而到了有光纤组成的SAN环境,或者由iSCSI组成的IPSAN环境,由于主机和存储通过了光纤交换机或者多块网卡及IP来 ...
- How to Pronounce WH Words — what, why, which
How to Pronounce WH Words — what, why, which Share Tweet Share Have you noticed that there are two d ...
- selenium IDE常用命令
1.open(URL)命令 1.作用:打开指定的URL,URL或者为相对或是绝对的URL 2.target:要打开的URL,value值 ...
- PIE结对编程
学习进度条 点滴成就 学习时间 新编写代码行数 博客量 学到知识点 第一周 8 0 0 了解软件工程 第二周 7 0 1 了解软件工程 第三周 11 0 1 用例图 第四周 6 25 0 结对编程 第 ...
- inner join和outer join
内连接 只连接匹配的行 左外连接 包含左边表的全部行(不管右边的表中是否存在与它们匹配的行),以及右边表中全部匹配的行 A left join B等价于A left ...
- ASP.NET使用ListView数据绑定控件和DataPager实现数据分页显示(一)
为什么使用ListView+DataPager的方式实现分页显示? .net提供的诸多数据绑定控件,每一种都有它自己的优点和缺点.如果需要对数据进行操作,如果数据量不大的情况下,DataList和Gr ...
- 使用VisualStudio开发php的图文设置方法[xyytit]
早先在asp横行的年代,php和asp一样,大都都是html中夹杂代码,说实话,这时候IDE的确用处不是很大,倒是类似于dw之类的设计器甚为上手. 现在,三层.mvc之类的思想遍地开花,使得代码和 ...
- OC 线程操作3 - NSOperation 实现线程间通信
#import "ViewController.h" @interface ViewController () /** 图片 */ @property (weak, nonatom ...
- PHP资源列表(转)
一个PHP资源列表,内容包括:库.框架.模板.安全.代码分析.日志.第三方库.配置工具.Web 工具.书籍.电子书.经典博文等等. 初始翻译信息来自:<推荐!国外程序员整理的 PHP 资源大全& ...
- 面向对象设计模式纵横谈:Adapter 适配器模式(笔记记录)
适配(转换)的概念无处不在 适配,即在不改变原有实现的基础上,将原先不兼容的接口转换为兼容的接口.生活中适配转换的例子太多了,也是设计模式里面比较容易理解的一个模式. 动机(Motivation) 在 ...