题意:

给你一个无向图,你需要找出来其中有几个桥

桥:
1、存在重边必定不为桥
2、low[v]>dfn[u]

代码:

//题意很清晰
//就是这个需要先找出来原无向图中的桥个数,然后在判断添加边之后会不会形成环,形成环的话,这个环里面的是没有桥的
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<map>
#include<math.h>
#include<set>
#include<queue>
using namespace std;
typedef long long ll;
const int maxn=100005;
const int mod=26;
const int INF=0x3f3f3f3f;
const int block=300;
int dfn[maxn],low[maxn],isbridge[maxn],visit[maxn],depth;
int pre[maxn],bridge_cnt;
vector<int>w[maxn];
void dfs(int u,int fu) //这是无向图找桥的方法,当无环图出现环的时候,那么这个里面没有桥,其他情况有
{ //有向图找桥的时候,当出现一个环的时候这个环里面的边也都不是桥,相当于把这个环缩成了一个超级点
dfn[u]=low[u]=++depth;
visit[u]=1;
int flag=1;
int len=w[u].size();
for(int i=0;i<len;++i)
{
int v=w[u][i];
//printf("%d %d**1**\n",u,v);
if(flag && v==fu)
{
//printf("%d %d**2**\n",u,v);
flag=0;
continue;
}
if(dfn[v]==-1)
{
//printf("%d %d**3**\n",u,v);
pre[v]=u;
dfs(v,u);
low[u]=min(low[u],low[v]);
if(low[v]>dfn[u])
{
//printf("%d %d**666**\n",u,v);
isbridge[v]=1;
bridge_cnt++;
}
}
else if(visit[v]) //printf("%d %d**4**\n",u,v),
low[u]=min(dfn[v],low[u]);
}
//无环图找桥是不需要dfn[u]==low[u]这个判断的,具体为什么可以自己写一下
}
int lca(int u,int v) //找到公共最近父节点
{
int res=0;
if(dfn[u]<dfn[v]) swap(u,v);
while(dfn[u]>dfn[v])
{
if(isbridge[u])
{
isbridge[u]=0;
res++;
}
u=pre[u]; //pre是u父亲节点
}
while(dfn[v]>dfn[u])
{
if(isbridge[v])
{
isbridge[v]=0;
res++;
}
v=pre[v];
}
//经过上面两个while,这样dfn[u]==dfn[v]此时他们就到达了最近公共父节点
return res;
}
int main()
{
int n,m,t=0;
while(~scanf("%d%d",&n,&m) && (n || m))
{
for(int i=1;i<=n;++i)
{
w[i].clear();
}
int u,v;
while(m--)
{
scanf("%d%d",&u,&v);
w[u].push_back(v);
w[v].push_back(u);
}
memset(dfn,-1,sizeof(dfn));
memset(isbridge,0,sizeof(isbridge));
memset(visit,0,sizeof(visit));
depth=bridge_cnt=0;
for(int i=1;i<=n;++i) //输入的原图就是所有点都连接在一起,不会出现好几个连通图
if(dfn[i]==-1)
dfs(1,-1);
//printf("%d**\n",bridge_cnt);
int q;
scanf("%d",&q);
printf("Case %d:\n", ++t);
while(q--)
{
scanf("%d%d",&u,&v);
int ans=lca(u,v);
bridge_cnt-=ans;
printf("%d\n",bridge_cnt);
}
//printf("\n");
}
return 0;
}

Network POJ - 3694 无向图找桥的更多相关文章

  1. poj 3694 无向图求桥+lca

    题意抽象为: 给一个无向图和一些询问 对于每一次询问: 每次询问都会在图上增加一条边 对于每一次询问输出此时图上桥的个数. 桥的定义:删除该边后原图变为多个连通块. 数据规模:点数N(1 ≤ N ≤ ...

  2. POJ 3694 无向图的桥

    Network Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 10404   Accepted: 3873 Descript ...

  3. Network POJ - 3694 (LCA+tarjan+桥)

    题目链接:https://vjudge.net/problem/POJ-3694 具体思路:首先可以通过缩点的方式将整个图变成一个树,并且树的每条边是桥,但是我们可以利用dfn数组将整个图变成树,这样 ...

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

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

  5. Network POJ - 3694 (连通图标求桥)

    有上述两个数组定义可知:对于某点root,其有一儿子v,则有: 1.     如果dfn[root]<=low[v]此点是割点(对于dfs树的根,即最初节点需要两个儿子才是割点) 2.      ...

  6. Network UVA - 315 无向图找割点

    题意: 给你一个无向图,你需要找出来其中有几个割点 割点/割项: 1.u不为搜索起点,low[v]>=dfn[u] 2.u为搜索起点,size[ch]>=2 3.一般情况下,不建议在tar ...

  7. [kuangbin带你飞]专题九 连通图D - Network POJ - 3694

    这道题其实也非常简单,只是在求割边及其个数的情况下,每次往里面加入新的边,并再次计算割边的个数. 我们用tarjan可以求出原图的桥以及个数,当然我们不能暴力加边,然后求解,那么如何求呢??? 其实非 ...

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

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

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

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

随机推荐

  1. C++中的extern“C”

    首先引入extern"C"的官方解释 extern "C" is meant to be recognized by a C++ compiler and to ...

  2. 【Web】CSS实现抖音风格字体效果(设置文本阴影)

    简单记录 -慕课网- 步骤一:抖音风格字体效果 案例:抖音风格的字体特效. 实现这个 需要设置 网页背景颜色 字体颜色 字体大小 文本阴影 重点介绍如何设置文本阴影 CSS的文本阴影text-shad ...

  3. 【ORA】Specified value of MEMORY_TARGET is too small, needs to be at least 3072M解决办法

    今天安装EM12C的时候遇到了一个报错: 修改好数据库中的参数大小后,重新启动报错 Specified value of MEMORY_TARGET is too small, needs to be ...

  4. LeetCode454. 四数相加 II

    题目 给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0. 分析 关键是如何想到用 ...

  5. 攻防世界 - Crypto(一)

    base64: 根据题目base64可知编码方式,下载附件发现是一个txt文件,把内容用工具解码就彳亍了,即可得到flag, flag: cyberpeace{Welcome_to_new_World ...

  6. [WPF] 在单元测试中使用 Prism 的 EventAggregator,订阅到 ThreadOption.UIThread 会报错

    1. 问题 [TestClass] public class UnitTest1 { [TestMethod] public void TestMethod1() { ContainerLocator ...

  7. 入门OJ:Coin

    题目描述 你有n个硬币,第i硬币面值为ai,现在总队长想知道如果丢掉了某个硬币,剩下的硬币能组成多少种价值?(0价值不算) 输入格式 第一行一个整数n 第二行n个整数.,a1,a2-an. 1< ...

  8. 手机QQ空间自动点赞登录

    学以致用~使用 Appium 模拟人类操控手机行为 V2.0在手机上运行,目前实现以下功能: 1.小黑屋模式,一分钟内给好友发100条消息然后进了好友的小黑屋 2.定时发消息提醒对象多喝热水~ 3.对 ...

  9. 部署自动初始化Schema的数据库

    我们使用容器的方式部署数据库组件,特别是企业有大量的项目开发业务的,部署的开发.测试数据库组件较多时.经常会遇到以下问题: 业务需要使用数据库,但部署完数据库后,需要在数据库中执行创建schema的操 ...

  10. LoadRunner监控Centos和Ubuntu资源之服务器配置

    Centos 我用的版本是Centos6.8   首先更新源以及基础操作我就不说了,直接上步骤: Step 1 安装相关程序 执行命令:yum install inetd,这一步是为了安装rstatd ...