Network(Tarjan+LCA)
#include <stdio.h>
#include <string.h>
#include <queue>
#include <algorithm>
#include <stack>
const int N=;
using namespace std;
struct node
{
int u,v,w;
int next;
} edge[N*];
//dfn[i]表示点i的深度优先数;
int dfn[N],low[N],head[N]; //low[i]表示点i可到达的最低深度优先数
int vis[N],bridge[N],f[N];
int n,m,cnt,dfs_clock,Conn_cnt;
int ans ;
stack<int>S; void init()
{
ans = ;
cnt = ;
dfs_clock = ;
Conn_cnt = ;
for (int i = ; i <= n; i++)
f[i] = i;
memset(dfn,,sizeof(dfn));
memset(low,,sizeof(low));
memset(vis,,sizeof(vis));
memset(head,-,sizeof(head));
}
void add(int u,int v)
{
edge[cnt].v = v;
edge[cnt].next = head[u];
head[u] = cnt++;
edge[cnt].v = u;
edge[cnt].next = head[v];
head[v] =cnt++;
} void dfs(int u)//Tarjan算法
{
vis[u] = ;
dfn[u]=low[u]=++dfs_clock;//设定初值
S.push(u);//将节点u压入栈中
for (int i = head[u]; i!=-; i=edge[i].next)//遍历u的临接点
{
int v = edge[i].v;
if (!vis[v])//如果改点的深度优先数为0(即没有搜索过)
{
f[v] = u;//记录父节点
dfs(v);//继续向下找
low[u] = min(low[u],low[v]);//回溯过程中计算low[]的值
if(low[v] > dfn[u])
{
ans++;
bridge[v] = ;//标记点u->v为桥
}
}
else if(vis[v]==&&v!=f[u])
{
low[u] = min(low[u],dfn[v]);
}
}
vis[u] = ;
}
void LCA(int u,int v)
{
if (dfn[u] < dfn[v])
swap(u,v);
while(dfn[u] > dfn[v])
{
if (bridge[u])
{
ans--;
bridge[u] = ;
}
u = f[u];
}
while(u!=v)
{
if (bridge[u])
{
ans--;
bridge[u] = ;
}
if (bridge[v])
{
ans--;
bridge[v] = ;
}
u = f[u];
v = f[v];
}
}
int main()
{
int u,v,o = ;
while(~scanf("%d%d",&n,&m))
{
if (n==&&m==)
break;
init();
o++;
for (int i = ; i < m; i++)
{
scanf("%d%d",&u,&v);
add(u,v);
}
dfs();
int t;
scanf("%d",&t);
printf("Case %d:\n",o);
while(t--)
{
scanf("%d%d",&u,&v);
LCA(u,v);
printf("%d\n",ans);
}
puts("");
}
return ;
}
Network(Tarjan+LCA)的更多相关文章
- poj 3417 Network(tarjan lca)
poj 3417 Network(tarjan lca) 先给出一棵无根树,然后下面再给出m条边,把这m条边连上,然后每次你能毁掉两条边,规定一条是树边,一条是新边,问有多少种方案能使树断裂. 我们设 ...
- POJ 3694 Network (tarjan + LCA)
题目链接:http://poj.org/problem?id=3694 题意是给你一个无向图n个点,m条边,将m条边连接起来之后形成一个图,有Q个询问,问将u和v连接起来后图中还有多少个桥. 首先用t ...
- [Codeforces 555E]Case of Computer Network(Tarjan求边-双连通分量+树上差分)
[Codeforces 555E]Case of Computer Network(Tarjan求边-双连通分量+树上差分) 题面 给出一个无向图,以及q条有向路径.问是否存在一种给边定向的方案,使得 ...
- Tarjan+LCA【洛谷P2783】 有机化学之神偶尔会做作弊
[洛谷P2783] 有机化学之神偶尔会做作弊 题目背景 XS中学化学竞赛组教练是一个酷爱炉石的人. 有一天他一边搓炉石一边监考,而你作为一个信息竞赛的大神也来凑热闹. 然而你的化竞基友却向你求助了. ...
- 洛谷 P2783 有机化学之神偶尔会做作弊(Tarjan,LCA)
题目背景 LS中学化学竞赛组教练是一个酷爱炉石的人. 有一天他一边搓炉石一边监考,而你作为一个信息竞赛的大神也来凑热闹. 然而你的化竞基友却向你求助了. “第1354题怎么做”<--手语 他问道 ...
- POJ 3694 Network(Tarjan求割边+LCA)
Network Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 10969 Accepted: 4096 Descript ...
- POJ3694 Network(Tarjan双联通分图 LCA 桥)
链接:http://poj.org/problem?id=3694 题意:给定一个有向连通图,每次增加一条边,求剩下的桥的数量. 思路: 给定一个无向连通图,添加一条u->v的边,求此边对图剩余 ...
- HDU 3078:Network(LCA之tarjan)
http://acm.hdu.edu.cn/showproblem.php?pid=3078 题意:给出n个点n-1条边m个询问,每个点有个权值,询问中有k,u,v,当k = 0的情况是将u的权值修改 ...
- poj 3694 pku 3694 Network tarjan求割边 lca
题意:给你一个连通图,然后再给你n个询问,每个询问给一个点u,v表示加上u,v之后又多少个桥.一个最容易想到的办法就是先加边找桥,加边找桥,这样可定超时.那么就可以缩点,因为如果一条边不是桥那么无论怎 ...
随机推荐
- js识别手机访问自动跳转到相应页面
/* * 智能机浏览器版本信息: * */ var browser={ versions:function(){ var u = navigator.userAgent, app = navigato ...
- 【解题报告】洛谷 P2571 [SCOI2010]传送带
[解题报告]洛谷 P2571 [SCOI2010]传送带今天无聊,很久没有做过题目了,但是又不想做什么太难的题目,所以就用洛谷随机跳题,跳到了一道题目,感觉好像不是太难. [CSDN链接](https ...
- Tensorflow学习笔记(1):tf.slice()函数使用
tensorflow 当中的一个常用函数:Slice() def slice(input_, begin, size, name=None) 函数的功能是根据begin和size指定获取input的部 ...
- cout 按进制数出
头文件: #include<iostream> #include<iomanip> //setbase() #include<bitset> //bitset< ...
- java.lang unsupported classversion解决方法
设置编译的jdk和运行的jdk环境版本是否一致.一般都是jdk导致的.刚开始用jdk1.6编译运行,死活不行,换成jdk1.7运行也是1.7,ok
- idea必选配置
参考: IDEA配置
- Linux学习笔记记录(九)
- OS X中微信双开
1.打开系统终端: 2.下载插件,输入命令(不包括括号) git clone https://github.com/Sunnyyoung/WeChatTweak-macOS.git 并回车: 3.进入 ...
- Java核心技术 卷一 复习笔记(乙
1.字符串从概念上讲,Java字符串就是Unicode字符序列.Java没有内置的字符串类型,而是在标准Java类库中提供了一个预定义类,叫String. 每个用双引号括起来的字符串都是 String ...
- Vuex实践小记
1.目录结构 2.开始(安装vuex) npm install vuex --save 3.编辑store/index.js(创建一个Vuex.store状态管理对象) import Vue from ...