在给出的两个点上加一条边,求剩下桥的数量,,不会LCA在线,就用了最普通的,先Tarjan双联通缩点,然后将缩完的图建成一棵树,树的所有边就是桥了,如果在任意两点间加一条边的话,那么从两点到最近公共祖先的所有边都不是桥了。。。。。。

#pragma comment(linker, "/STACK:10240000000000,10240000000000")
#include<stdio.h>
#include<stack>
#include<string.h>
#define N 100010
using namespace std;
int belong[N],low[N],dfs[N],head[N],num,n,idx,ans,nume,vis[N];
struct edge
{
int st,ed,next;
}E[N*4],e[N*4];
void addedge(int x,int y)
{
E[num].st=x;
E[num].ed=y;
E[num].next=head[x];
head[x]=num++;
}
void Addedge(int x,int y)
{
e[nume].st=x;
e[nume].ed=y;
e[nume].next=head[x];
head[x]=nume++;
}
stack<int>Q;
void Tarjan(int u,int father)
{
int i,v,flag=0;
low[u]=dfs[u]=idx++;
Q.push(u);
for(i=head[u];i!=-1;i=E[i].next)
{
v=E[i].ed;
if(dfs[v]==-1)
{
Tarjan(v,u);
low[u]=low[u]>low[v]?low[v]:low[u];
}
else if(v==father)
{
if(flag)
low[u]=low[u]>dfs[v]?dfs[v]:low[u];
flag++;
}
else low[u]=low[u]>dfs[v]?dfs[v]:low[u];
}
if(low[u]==dfs[u])
{
do
{
v=Q.top();
Q.pop();
belong[v]=ans;
}while(v!=u);
ans++;
}
}
void dfs1(int u)
{
vis[u]=1;
int i,v;
for(i=head[u];i!=-1;i=e[i].next)
{
v=e[i].ed;
if(vis[v]==1)continue;
dfs[v]=dfs[u]+1;
low[v]=u;
dfs1(v);
}
}
void Lca(int x,int y)
{
int i;
if(dfs[x]<dfs[y])
{i=x;x=y;y=i;}
while(dfs[x]>dfs[y])
{
if(vis[x]==0)
{
vis[x]=1;
ans--;
}
x=low[x];
}
while(x!=y)
{
if(vis[x]==0)
{
vis[x]=1;
ans--;
}
if(vis[y]==0)
{
vis[y]=1;
ans--;
}
x=low[x];y=low[y];
}
}
int main()
{
int i,k,x,y,m,op=1;
while(scanf("%d%d",&n,&m),n||m)
{
memset(head,-1,sizeof(head));
num=0;
for(i=0;i<m;i++)
{
scanf("%d%d",&x,&y);
addedge(x,y);
addedge(y,x);
}
memset(dfs,-1,sizeof(dfs));
idx=ans=0;
Tarjan(1,-1);
memset(head,-1,sizeof(head));
nume=0;
for(i=0;i<num;i++)
{
x=belong[E[i].st];
y=belong[E[i].ed];
if(x==y)continue;
Addedge(x,y);
Addedge(y,x);
}
memset(vis,0,sizeof(vis));
dfs[0]=0;
low[0]=0;
dfs1(0);
memset(vis,0,sizeof(vis));
printf("Case %d:\n",op++);
scanf("%d",&k);
ans--;
while(k--)
{
scanf("%d%d",&x,&y);
Lca(belong[x],belong[y]);
printf("%d\n",ans); }
printf("\n");
}
return 0;
}

hdu 2460 poj 3694 (双联通+LCA)的更多相关文章

  1. poj 3694双联通缩点+LCA

    题意:给你一个无向连通图,每次加一条边后,问图中桥的数目. 思路:先将图进行双联通缩点,则缩点后图的边就是桥,然后dfs记录节点深度,给出(u,v)使其节点深度先降到同一等级,然后同时降等级直到汇合到 ...

  2. Tarjan总结(缩点+割点(边)+双联通+LCA+相关模板)

    Tarjan求强连通分量 先来一波定义 强连通:有向图中A点可以到达B点,B点可以到达A点,则称为强连通 强连通分量:有向图的一个子图中,任意两个点可以相互到达,则称当前子图为图的强连通分量 强连通图 ...

  3. HDU 2460 Network(双连通+树链剖分+线段树)

    HDU 2460 Network 题目链接 题意:给定一个无向图,问每次增加一条边,问个图中还剩多少桥 思路:先双连通缩点,然后形成一棵树,每次增加一条边,相当于询问这两点路径上有多少条边,这个用树链 ...

  4. hdu 3352 求边双联通分量模板题(容器)

    /*这道题是没有重边的,求加几条边构成双联通,求边联通分量,先求出桥然后缩点,成一个棵树 找叶子节点的个数*/ #include<stdio.h> #include<string.h ...

  5. POJ 3694 Network 无向图双联通+LCA

    一开始题目没看清楚,以为是增加那条边后还有多少桥,所以就当做是无向图tarjan缩点后建树,然后求u,v的最近公共祖先,一直wa. 后来再看题目后才发现边放上去后不会拿下来了,即增加i条边后桥的数量. ...

  6. poj 3694 Network(割边+lca)

    题目链接:http://poj.org/problem?id=3694 题意:一个无向图中本来有若干条桥,有Q个操作,每次加一条边(u,v),每次操作后输出桥的数目. 分析:通常的做法是:先求出该无向 ...

  7. HDU 5458 Stability(双连通分量+LCA+并查集+树状数组)(2015 ACM/ICPC Asia Regional Shenyang Online)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5458 Problem Description Given an undirected connecte ...

  8. POJ 3694 Network (tarjan + LCA)

    题目链接:http://poj.org/problem?id=3694 题意是给你一个无向图n个点,m条边,将m条边连接起来之后形成一个图,有Q个询问,问将u和v连接起来后图中还有多少个桥. 首先用t ...

  9. poj 3694(割边+lca)

    题意:给你一个无向图,可能有重边,有q次询问,问你每次我添加一条边,添加后这个图还有多少个桥 解题思路:首先先把所有没有割边的点对缩成一个联通块,无向图一般并查集判环,然后就得到一个割边树,给你一条新 ...

随机推荐

  1. struts2 Convention插件零配置,使用注解开发

    从struts21开始,struts2不再推荐使用codebehind作为零配置插件,而是改用Convention插件来支持零配置.与以前相比较,Convention插件更彻底. 使用Conventi ...

  2. Git for Windows安装和基本设置

    1.下载地址: http://msysgit.github.io/ 2.下载完成后安装,安装路径自己选择,其他的选项参照下图: 其他的一步一步往下即可,最后Finish完成安装: 3.配置github ...

  3. 数据结构(动态树):UOJ 207 共价大爷游长沙

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABHwAAAJZCAIAAABUW7XHAAAgAElEQVR4nOy93cstx5Xm2f9TXh2EOe

  4. 【动态规划】Vijos P1104 采药(NOIP2005普及组第三题)

    题目链接: https://vijos.org/p/1104 题目大意: T时间,n个物品,每个耗时ti,可获得收益ci,求最大收益. 题目思路: [动态规划] 01背包裸题.一维二维都过了,放个一维 ...

  5. Unique Binary Search Trees——LeetCode

    Given n, how many structurally unique BST's (binary search trees) that store values 1...n? For examp ...

  6. 什么是左值(what is a lvalue)?

    引用并翻译自<C++ premier plus> 左值是可以通过地址引用的数据对象(data object),例如,变量,数组的元素,结构体的成员,引用变量,以及复引用的指针(defere ...

  7. Java同步工具类总结

    先谈谈闭锁和栅栏的区别: 1.关键区别在于,所有线程必须同时到达栅栏位置,才能继续执行. 2.闭锁用于等待某一个事件的发生,举例:CountDownLatch中await方法等待计数器为零时,所有事件 ...

  8. url传递中文的解决方案

    本文转载:http://www.cnblogs.com/ghd258/archive/2005/10/23/260241.html url传递中文的解决方案 1.设置web.config文件. < ...

  9. hdu 4123 树形DP+RMQ

    http://acm.hdu.edu.cn/showproblem.php? pid=4123 Problem Description Bob wants to hold a race to enco ...

  10. 网络编程---(数据请求+slider)将网络上的大文件下载到本地,并打印其进度

    网络编程---将网络上的大文件下载到本地,并打印其进度. 点击"開始传输"button.将网络上的大文件先下载下来,下载完毕后,保存到本地. UI效果图例如以下: watermar ...