hdu2460-Network:边的双连通分量
题目大意:给出一个无向图以及Q次询问,每次询问增加一条无向边,要求输出增加这条边后剩余的桥的数目。
算法:类似于求割点的方法,先做一次dfs求出所有的桥,并且维护这棵dfs树,当一次询问加入一条边(a,b)之后,会在dfs上形成一个环,在这个环上的桥都变为非桥,这个环肯定经过a和b的LCA,此时我们只需在求LCA的过程中把经过的为桥的树边标记为非桥,同时cnt_bridge--再输出即可。
需要注意的是树边的编号是用树边指向的那个节点的编号来表示的,例如树边<u,v>用编号v表示。
还有就是加入一个#pragma预处理指令可以防止爆栈。
#include <iostream>
#include <stdio.h>
#include <cstring>
#include <vector>
using namespace std;
#pragma comment(linker,"/STACk:10240000,10240000") const int maxn = + ;
int low[maxn],pre[maxn], iscut[maxn], dfs_clock=;
bool isbridge[maxn];
vector<int> G[maxn];
int cnt_bridge;
int father[maxn]; int dfs(int u, int fa)
{
father[u]=fa;
int lowu = pre[u] = ++dfs_clock;
int child = ;
for(int i = ; i < G[u].size(); i++)
{
int v = G[u][i];
if(!pre[v]) // 没有访问过v
{
child++;
int lowv = dfs(v, u);
lowu = min(lowu, lowv); // 用后代的low函数更新自己
if(lowv > pre[u]) // 判断边(u,v)是否为桥
{
isbridge[v]=true;
cnt_bridge++;
}
}
else if(pre[v] < pre[u] && v != fa)
{
lowu = min(lowu, pre[v]); // 用反向边更新自己
}
}
if(fa < && child == )
iscut[u] = ;
return low[u]=lowu;
} void init(int n)
{
memset(isbridge,false,sizeof isbridge);
memset(pre,,sizeof pre);
cnt_bridge=dfs_clock=;
for(int i=; i<n; i++)
{
G[i].clear();
}
} void LCA(int a,int b)
{
while(pre[a]>pre[b])
{
if(isbridge[a])
{
isbridge[a]=false;
cnt_bridge--;
}
a=father[a];
}
while(pre[b]>pre[a])
{
if(isbridge[b])
{
isbridge[b]=false;
cnt_bridge--;
}
b=father[b];
}
if(a!=b)
{
while(pre[a]>pre[b])
{
if(isbridge[a])
{
isbridge[a]=false;
cnt_bridge--;
}
a=father[a];
}
while(pre[b]>pre[a])
{
if(isbridge[b])
{
isbridge[b]=false;
cnt_bridge--;
}
b=father[b];
}
}
} int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif int n,m,Case=;
while(scanf("%d %d",&n,&m),!(n== && m==))
{
init(n);
for(int i=; i<m; i++)
{
int a,b;
scanf("%d %d",&a,&b);
a--;
b--;
G[a].push_back(b);
G[b].push_back(a);
} // 第一次dfs找出所有的桥
dfs(,-);
int Q;
cin>>Q;
printf("Case %d:\n",Case++);
while(Q--)
{
int a,b;
scanf("%d %d",&a,&b);
a--;
b--;
LCA(a,b);
printf("%d\n",cnt_bridge);
if(Q==)
printf("\n");
}
} return ;
}
hdu2460-Network:边的双连通分量的更多相关文章
- POJ3694 Network(边双连通分量+缩点+LCA)
题目大概是给一张图,动态加边动态求割边数. 本想着求出边双连通分量后缩点,然后构成的树用树链剖分+线段树去维护路径上的边数和..好像好难写.. 看了别人的解法,这题有更简单的算法: 在任意两点添边,那 ...
- POJ1144 Network 题解 点双连通分量(求割点数量)
题目链接:http://poj.org/problem?id=1144 题目大意:给以一个无向图,求割点数量. 这道题目的输入和我们一般见到的不太一样. 它首先输入 \(N\)(\(\lt 100\) ...
- [Codeforces 555E]Case of Computer Network(Tarjan求边-双连通分量+树上差分)
[Codeforces 555E]Case of Computer Network(Tarjan求边-双连通分量+树上差分) 题面 给出一个无向图,以及q条有向路径.问是否存在一种给边定向的方案,使得 ...
- [hdu2460]network(依次连边并询问图中割边数量) tarjan边双联通分量+lca
题意: 给定一个n个点m条边的无向图,q个操作,每个操作给(x,y)连边并询问此时图中的割边有多少条.(连上的边会一直存在) n<=1e5,m<=2*10^5,q<=1e3,多组数据 ...
- HDU 2460 Network 边双连通分量 缩点
题意: 给出一个无向连通图,有\(m\)次操作,每次在\(u, v\)之间加一条边,并输出此时图中桥的个数. 分析: 先找出边双连通分量然后缩点得到一棵树,树上的每条边都输原图中的桥,因此此时桥的个数 ...
- tarjan算法与无向图的连通性(割点,桥,双连通分量,缩点)
基本概念 给定无向连通图G = (V, E)割点:对于x∈V,从图中删去节点x以及所有与x关联的边之后,G分裂为两个或两个以上不相连的子图,则称x为割点割边(桥)若对于e∈E,从图中删去边e之后,G分 ...
- 双连通分量(点-双连通分量&边-双连通分量)
概念: 双连通分量有点双连通分量和边双连通分量两种.若一个无向图中的去掉任意一个节点(一条边)都不会改变此图的连通性,即不存在割点(桥),则称作点(边)双连通图. 一个无向图中的每一个极大点(边)双连 ...
- POJ2942 Knights of the Round Table[点双连通分量|二分图染色|补图]
Knights of the Round Table Time Limit: 7000MS Memory Limit: 65536K Total Submissions: 12439 Acce ...
- 【Codefoces487E/UOJ#30】Tourists Tarjan 点双连通分量 + 树链剖分
E. Tourists time limit per test: 2 seconds memory limit per test: 256 megabytes input: standard inpu ...
- 【BZOJ-2730】矿场搭建 Tarjan 双连通分量
2730: [HNOI2012]矿场搭建 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1602 Solved: 751[Submit][Statu ...
随机推荐
- java笔记4之比较运算符
/* 比较运算符: ==,!=,>,>=,<,<= 特点: 无论你的操作是简单还是复杂,结果是boolean类型. ...
- 【转】H264视频编码级别说明profile level Encoder
版权声明:本文为博主原创文章,未经博主允许不得转载. 首先要阐明所谓的AVC其实就是H.264标准,是由ITU-T和ISO/IEC组成的联合视频组(JVT,Joint Video Team)一起开发的 ...
- 模型-视图-控制器 (MVC)
在MVC中 ,模型代表数据和业务规则, 视图包含了用户界面元素,例如文本,表单等 控制器则管理模型和视图中的通信
- DB2高级安装
学习从安装开始,哈哈.这里记下 Windows 和 UNIX/Linux安装DB2的各种方式,不同,及具体的一些细节. Windows下向导化安装: setup.exe ...
- SUBTOTAL 函数与所在行
SUBTOTAL 函数与所在行 设计要点:数据汇总.隐藏.筛选 阿金:给你推荐一个函数SUBTOTAL. 秀秀:又是函数!俺不喜欢. 阿金:虽然你不喜欢函数,但是你也离不了啊,比如汇总. 秀秀:那倒是 ...
- onActivityResult不执行 或者 onActivityResult的解决方法
开发人员都知道,可以通过使用 startActivityForResult() 和 onActivityResult() 方法来传递或接收参数.然而在一次使用中,还没等到被调用的 Activity 返 ...
- codeforces Arrival of the General 题解
A Ministry for Defense sent a general to inspect the Super Secret Military Squad under the command o ...
- [React] React Router: hashHistory vs browserHistory
In this lesson we'll look at hashHistory which uses a hash hack to track our route changes vs browse ...
- 《STL源代码剖析》---stl_alloc.h阅读笔记
这一节是讲空间的配置与释放,但不涉及对象的构造和析构,仅仅是解说对象构造前空前的申请以及对象析构后空间怎么释放. SGI版本号的STL对空间的的申请和释放做了例如以下考虑: 1.向堆申请空间 2.考虑 ...
- [编辑中] 免费的Internet流量发生器 | Free Internet Traffic Generators
流量发生器 (Traffic Generator) 是用来检测网络性能,进行网络相关研究的一个很重要的工具.大家可能用过Iperf或者IxChariot,前者是类UNIX环境下的一个免费.开源的网络性 ...