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 =============================以下是最小生成树+并 ...
随机推荐
- css图片垂直居中
css图片垂直居中一.style代码 .case-pic{ height: 125px; position: relative; text-align: center } .case-pic span ...
- Android 开发第二天
开发入门HelloWorld 首先打开开发工具 第一步 第二步 效果图 以后可以点击一直下去 第三步骤介绍一下里面项目的作用 SRC是用来保存源代码的东西MainAcrivity.java主视图res ...
- C# MD5 16进制MD5对称加密法
/// <summary> /// MD5 16进制算法 /// </summary> /// <param name="str"></p ...
- EasyUI兼容IE问题
上网搜了下,发现说明白的解决方案不多,于是记录了一下: 根本原因是JQuery的版本造成IE8及以下兼容的问题,(由于EasyUI是基于JQuery框架的,而JQuery貌似从2013年为了简洁代码, ...
- PAT_1072 Gas Station
1072. Gas Station (30) 时间限制 200 ms 内存限制 32000 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue ...
- 学习笔记_Java_day14—编码实战___一个注册页面的完整流程
- Saltstack安装配置(一)
一.服务端和客户端安装 1.下载epel源 http://mirrors.zju.edu.cn/epel/6/ #wget http://mirrors.zju.edu.cn/epel/6/x86_6 ...
- c#md5与SHA1验证函数
/// <summary> /// MD5验证函数 /// </summary> /// <param name="fileName">文件的路 ...
- 飞锐GIS开发基础系列
3s知识库和GIS科研站,未经允许,禁止任何形式的复制.转载和传播.联系方式:276888624@qq.com 品GIS,品开发,品人生...... http://www.3sbase.com/3sb ...
- 九度OJ 1113 二叉树
题目地址:http://ac.jobdu.com/problem.php?pid=1113 题目描述: 如上所示,由正整数1,2,3……组成了一颗特殊二叉树.我们已知这个二叉树的最后一个结点是n.现在 ...