hdu 2460
这是一道双联通分量的题,要用到LCA算法;
听说这个算法有两种实现方式:一个是dfs+线段树或着RMQ;一个是用tarjin;
我用的是tarjin;
题目比较简单,就是每次加了一条边之后剩下的桥的个数;
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
#define MAXN 100009
#pragma comment(linker,"/STACk:10240000,10240000") int n,m,cnt,NE,BridgeNum;
int parent[MAXN],low[MAXN],dfn[MAXN];
bool mark[MAXN],isbridge[MAXN];
vector<int>ve[MAXN]; void Tarjan(int u,int father)
{
int flag=;
low[u]=dfn[u]=++cnt;
mark[u]=true;
int l=ve[u].size();
for(int i=; i<l; i++)
{
int v=ve[u][i];
if(v==father&&!flag)
{
flag=;
continue;
}
if(dfn[v]==)
{
parent[v]=u;
Tarjan(v,u);
low[u]=min(low[u],low[v]);
if(low[v]>dfn[u])
{
isbridge[v]=;
BridgeNum++;
}
}
else if(mark[v])
low[u]=min(low[u],dfn[v]);
}
} void LCA(int u,int v)
{
while(dfn[u]>dfn[v])
{
if(isbridge[u])
{
BridgeNum--;
isbridge[u]=;
}
u=parent[u];
}
while(dfn[v]>dfn[u])
{
if(isbridge[v])
{
BridgeNum--;
isbridge[v]=;
}
v=parent[v];
}
while(u!=v)
{
if(isbridge[u])
{
BridgeNum--;
isbridge[u]=;
}
if(isbridge[v])
{
BridgeNum--;
isbridge[v]=;
}
u=parent[u],v=parent[v];
}
}
int main()
{
int u,v,Q,ca=;
while(scanf("%d%d",&n,&m)&&(n+m))
{
BridgeNum=NE=cnt=;
for(int i=; i<=n; i++)
ve[i].clear();
while(m--)
{
scanf("%d%d",&u,&v);
ve[u].push_back(v);
ve[v].push_back(u);
}
memset(isbridge,,sizeof isbridge);
memset(dfn,,sizeof dfn);
memset(mark,,sizeof mark);
for(int i=; i<=n+; i++)parent[i]=i;
Tarjan(,-);
printf("Case %d:\n",ca++);
scanf("%d",&Q);
while(Q--)
{
scanf("%d%d",&u,&v);
LCA(u,v);
printf("%d\n",BridgeNum);
}
printf("\n");
}
return ;
}
hdu 2460的更多相关文章
- HDU 2460 Network(双连通+树链剖分+线段树)
HDU 2460 Network 题目链接 题意:给定一个无向图,问每次增加一条边,问个图中还剩多少桥 思路:先双连通缩点,然后形成一棵树,每次增加一条边,相当于询问这两点路径上有多少条边,这个用树链 ...
- HDU 2460 Network(桥+LCA)
http://acm.hdu.edu.cn/showproblem.php?pid=2460 题意:给出图,求每次增加一条边后图中桥的数量. 思路: 先用tarjan算法找出图中所有的桥,如果lowv ...
- hdu 2460(tarjan求边双连通分量+LCA)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2460 思路:题目的意思是要求在原图中加边后桥的数量,首先我们可以通过Tarjan求边双连通分量,对于边 ...
- hdu 2460 poj 3694 (双联通+LCA)
在给出的两个点上加一条边,求剩下桥的数量,,不会LCA在线,就用了最普通的,先Tarjan双联通缩点,然后将缩完的图建成一棵树,树的所有边就是桥了,如果在任意两点间加一条边的话,那么从两点到最近公共祖 ...
- HDU 2460 Network 边双连通分量 缩点
题意: 给出一个无向连通图,有\(m\)次操作,每次在\(u, v\)之间加一条边,并输出此时图中桥的个数. 分析: 先找出边双连通分量然后缩点得到一棵树,树上的每条边都输原图中的桥,因此此时桥的个数 ...
- HDU 2460 Network 傻逼Tarjan
Network Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- Tarjan & LCA 套题题目题解
刷题之前来几套LCA的末班 对于题目 HDU 2586 How far away 2份在线模板第一份倍增,倍增还是比较好理解的 #include <map> #include <se ...
- -【线性基】【BZOJ 2460】【BZOJ 2115】【HDU 3949】
[把三道我做过的线性基题目放在一起总结一下,代码都挺简单,主要就是贪心思想和异或的高斯消元] [然后把网上的讲解归纳一下] 1.线性基: 若干数的线性基是一组数a1,a2,a3...an,其中ax的最 ...
- 【转载】图论 500题——主要为hdu/poj/zoj
转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...
随机推荐
- selendroid项目实战教程1
selendroid是国内使用非常少的框架.资料也少.刚好公司项目用到,给大家分享下,技术不太行,有错误还望指正. 使用selendroid契机,是公司开发的APP,需要大量捕捉Toast信息.公司的 ...
- python中关于正则表达式一
ab+,描述一个'a'和任意个'b',那么'ab','abb','abbbbb' 正则表达式可以:1.验证字符串是否符合指定特征,比如验证是否是合法的邮件地址 2.用来查找字符串,从一个长的文本中查找 ...
- powerbulider9.0在数据窗口中实现滚动到新添加行
powerbuilder9.0对数据窗口进行增加行操作,然后实现滚动到指定行时,应先滚动到指定行dw_1.scrolltorow( row),然后设置新添加的行为当前行dw_1.setrow( row ...
- 基于mod_proxy+Apache 2.2.16+Tomcat 7的负载均衡与集群配置
第一章. 背景简介 对于大多数企业应用,都希望能做到7*24小时不间断运行.要保持如此高的可用性并非易事,比较常见的做法是将系统部署到多台机器上,每台机器都对外提供同样的功能,这就是集群.系统变为集群 ...
- iOS9 UITableViewCell separatorInset设置为0分割线还是没有顶到头的问题
只需要在自定义的Cell中添加以下代码即可 override func awakeFromNib() { super.awakeFromNib() layoutMargins = UIEdgeInse ...
- Objective-c单例模式详解
转载自:http://www.jianshu.com/p/85618bcd4fee 单例模式出现以后,关于它的争执就一直存在.在开发项目中,有很多时候我们需要一个全局的对象,而且要保证全局有且仅有一份 ...
- Java中多线程的使用!!
简介: 1.要了解多线程,首先我们得先了解进程和线程.那么什么是进程?进程就是一个正在运行的程序分配内存让应用程序能够运行的叫做进程.那么什么又是线程呢?线程:在一个程序中,负责代码的执行 ...
- python-MySQLdb-练习
看完视频,自己练习一遍. 还是遇到问题,不过最终还是解决了.贴上完成的代码. CREATE TABLE `NewTable` ( `acctid` int(11) NOT NULL AUTO_INCR ...
- 幾種方法實現C語言Macro for debug
1. #include <stdio.h> #include <stdlib.h> #define DEBUG 1 #ifdef DEBUG #define DEBUG_PRI ...
- 配置php连接apache
配置php连接apache 1.安装php所需要的库 yum install zlib-devel libxml2-devel libjpeg-devel libjpeg-turbo-devel li ...