题意:

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

桥:
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. HAProxy-1.8.20 根据后缀名转发到后端服务器

    global maxconn 100000 chroot /data/soft/haproxy stats socket /var/lib/haproxy/haproxy.sock mode 600 ...

  2. Linux学习笔记 | 常见错误之无法获得锁

    问题: 当运行sudo apt-get install/update/其他命令时,会出现如下提示: E: 无法获得锁 /var/lib/dpkg/lock-frontend - open (11: 资 ...

  3. mysql中更改字段属性实际上都做了哪些操作

     mysql> set profiling=1; Query OK, 0 rows affected (0.00 sec) mysql> alter table test modify n ...

  4. 【Linux】cron

    每五分钟执行  */5 * * * * 每小时执行     0 * * * *      0 */1 * * *   效果相同 每天执行        0 0 * * * 每周执行       0 0 ...

  5. 大文件上传FTP

    需求 将本地大文件通过浏览器上传到FTP服务器. 原有方法 将本地文件整个上传到浏览器,然后发送到node服务器,最后由node发送到FTP服务器. 存在问题 浏览器缓存有限且上传速率受网速影响,当文 ...

  6. oralce move和shrink释放高水位

    转自:https://blog.51cto.com/fengfeng688/1955137 move和shrink的共同点: 收缩段,消除部分行迁移,消除空间碎片,使数据更紧密 shrink用法: 语 ...

  7. wmic 查看主板信息

    查看主板信息的一个命令:wmic baseboard get 当然在命令提示符里查看,真的很费劲,所以我们将命令格式化一下:wmic baseboard get /format:HFORM >c ...

  8. 利用JavaUDPSocket+多线程模拟实现一个简单的聊天室程序

    对Socket的一点个人理解:Socket原意是指插座.家家户户都有五花八门的家用电器,但它们共用统一制式的插座.这样做的好处就是将所有家用电器的通电方式统一化,不需要大费周章地在墙壁上凿洞并专门接电 ...

  9. 制作 Ubuntu 16.04 离线apt源

    1.下载离线安装包 ubuntu下安装包都会下载到/var/cache/apt/archives下,首先清空该目录 sudo apt-get clean 下载需要安装包 sudo apt-get in ...

  10. Vue3.0网页版聊天|Vue3.x+ElementPlus仿微信/QQ界面|vue3聊天实例

    一.项目简介 基于vue3.x+vuex+vue-router+element-plus+v3layer+v3scroll等技术构建的仿微信web桌面端聊天实战项目Vue3-Webchat.基本上实现 ...