题意:给你一个无向图,可能有重边,有q次询问,问你每次我添加一条边,添加后这个图还有多少个桥

解题思路:首先先把所有没有割边的点对缩成一个联通块,无向图一般并查集判环,然后就得到一个割边树,给你一条新边,找到这条边两个端点的所属的联通块,如果这两个端点属于用一个联通块,那么没有作用,属于不同的联通块的时候,找到他们的lca,路径上有多少边,就减去多少割边,然后成为一个新的联通块,具体见代码

#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstring>
using namespace std;
const int maxn=;
struct Edge
{
int next;int to;int id;
}edge[maxn<<];
int head[maxn],cnt,dfn[maxn],low[maxn];
int fa[maxn],pre[maxn],ans,step,n,m;
void init()
{
memset(head,-,sizeof(head));cnt=ans=step=;
for(int i=;i<=n;i++)
fa[i]=i;
memset(dfn,,sizeof(dfn));memset(low,,sizeof(low)); }
int findf(int u)
{
if(fa[u]==u)
return u;
else
{
fa[u]=findf(fa[u]);
return fa[u];
}
}
bool join(int x,int y)
{
int t1=findf(x);
int t2=findf(y);
if(t1==t2)
return false;
else
{
fa[t2]=t1;
return true;
}
}
void add(int u,int v,int id)//id是用来判是否有重边的
{
edge[cnt].next=head[u];edge[cnt].to=v;edge[cnt].id=id;head[u]=cnt++;
edge[cnt].next=head[v];edge[cnt].to=u;edge[cnt].id=id;head[v]=cnt++;
}
void tarjan(int u,int fa)
{
dfn[u]=low[u]=++step;
for(int i=head[u];i!=-;i=edge[i].next)
{
int v=edge[i].to;
int id=edge[i].id;
if(fa==id)
continue;
if(!dfn[v])
{
pre[v]=u;//记录他的父亲结点
tarjan(v,id);
low[u]=min(low[v],low[u]);
if(dfn[u]<low[v])
{
ans++;
}
else
{
join(u,v);//不是割边就合并
} }
else
{
low[u]=min(low[u],dfn[v]);
}
}
}
void lca(int u,int v)
{
if(findf(u)==findf(v))
return;
if(dfn[v]<dfn[u])//根据之前pre数组,从小的位置开始
swap(u,v);
while(dfn[v]>dfn[u])
{
if(join(pre[v],v))//路径上的割边全部合并
{
ans--;
}
v=pre[v];
}
while(u!=v)//如果是1的另一个子树中,因为上一段最多判到1,还需要判另一半
{
if(join(pre[u],u))
ans--;
u=pre[u];
}
}
int main()
{
int x,y;
int k,cot;
cot=;
while(scanf("%d%d",&n,&m)&&n&&m)
{
cot++;
init();
for(int i=;i<=m;i++)
{
scanf("%d%d",&x,&y);add(x,y,i);
}
tarjan(,);
pre[]=;
printf("Case %d:\n",cot);
scanf("%d",&k);
while(k--)
{
scanf("%d%d",&x,&y);
lca(x,y);
printf("%d\n",ans);
}
}
}

poj 3694(割边+lca)的更多相关文章

  1. Network POJ - 3694(lca并查集+连通图求桥)

    就是求出原先图中的桥的数量,在每一次询问时加入一条新边,求加入当前边后图中剩余的桥的数量 求出原先图中的桥的数量,然后减去新加入边的两端点之间的桥的数量,就是剩余桥的数量.. 用并查集把属于同一集合的 ...

  2. 【POJ 3694】 Network(割边&lt;桥&gt;+LCA)

    [POJ 3694] Network(割边+LCA) Network Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 7971 ...

  3. POJ 3694——Network——————【连通图,LCA求桥】

    Network Time Limit:5000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Stat ...

  4. Poj 3694 Network (连通图缩点+LCA+并查集)

    题目链接: Poj 3694 Network 题目描述: 给出一个无向连通图,加入一系列边指定的后,问还剩下多少个桥? 解题思路: 先求出图的双连通分支,然后缩点重新建图,加入一个指定的边后,求出这条 ...

  5. Tarjan算法各种&RMQ& POJ 3694

    关于tarjan 的思想可以在网上搜到,具体我也不太清楚,应该说自己理解也不深,下面是做题经验得到的一些模板. 其中有很多转载,包括BYVoid等,感谢让我转...望各路大神愿谅 有向图求连通分量的一 ...

  6. poj 3694 Network(割边+lca)

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

  7. POJ 3694 Network(Tarjan求割边+LCA)

    Network Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 10969   Accepted: 4096 Descript ...

  8. poj 3694 pku 3694 Network tarjan求割边 lca

    题意:给你一个连通图,然后再给你n个询问,每个询问给一个点u,v表示加上u,v之后又多少个桥.一个最容易想到的办法就是先加边找桥,加边找桥,这样可定超时.那么就可以缩点,因为如果一条边不是桥那么无论怎 ...

  9. poj 3694 Network 边双连通+LCA

    题目链接:http://poj.org/problem?id=3694 题意:n个点,m条边,给你一个连通图,然后有Q次操作,每次加入一条边(A,B),加入边后,问当前还有多少桥,输出桥的个数. 解题 ...

随机推荐

  1. 百度地图DEMO-路线导航,测距,标点

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...

  2. k8s源码分析准备工作 - 源码准备

    本文原始地址:https://farmer-hutao.github.io/k8s-source-code-analysis/ 项目github地址:https://github.com/farmer ...

  3. RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.3版本全新发布

    1.RDIFramework.NET框架介绍 RDIFramework.NET,基于.NET的快速信息化系统开发.整合框架,为企业或个人快速开发系统提供了强大的支持,开发人员不需要开发系统的基础功能和 ...

  4. 杭电ACM2022--发工资咯:)

    发工资咯:) Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  5. c#下载文件选择路径控件

    <input id="file1" style="width: 240px; height: 20px; display:none;" type=&quo ...

  6. Docker 容器镜像删除

    1.停止所有的container,这样才能够删除其中的images: docker stop $(docker ps -a -q) 如果想要删除所有container的话再加一个指令: docker ...

  7. 关于computed使用时报no-side-effects-in-computed-properties错误

    不要在计算属性内直接修改data里面的数据,eslint会报 no-side-effects-in-computed-properties 错误,如果非要改可以写在一个函数里,然后在计算属性里调用该函 ...

  8. 在Docker中体验数据库之Mongodb

    本文记录一下,在docker中安装Mongodb的过程. 环境:物理机 ubuntu18.04 因为环境变了,我在一台物理机上直接安装了ubuntu(非虚拟机和双系统),制作U盘镜像.安装参考:htt ...

  9. DevExtreme App 开发记要

        添加插件 除提供的标准插件外,可直接在config.xml中书写配置,然后编译模板,在后台能看到相关的插件了         无法显示百度地图 在IPHONE中正常加载地图,但在安卓中提示BM ...

  10. 通过 Sqoop1.4.7 将 Mysql5.7、Hive2.3.4、Hbase1.4.9 之间的数据导入导出

    目录 目录 1.什么是 Sqoop? 2.下载应用程序及配置环境变量 2.1.下载 Sqoop 1.4.7 2.2.设置环境变量 2.3.设置安装所需环境 3.安装 Sqoop 1.4.7 3.1.修 ...