Network POJ - 3694 无向图找桥
题意:
给你一个无向图,你需要找出来其中有几个桥
桥:
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 无向图找桥的更多相关文章
- poj 3694 无向图求桥+lca
题意抽象为: 给一个无向图和一些询问 对于每一次询问: 每次询问都会在图上增加一条边 对于每一次询问输出此时图上桥的个数. 桥的定义:删除该边后原图变为多个连通块. 数据规模:点数N(1 ≤ N ≤ ...
- POJ 3694 无向图的桥
Network Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 10404 Accepted: 3873 Descript ...
- Network POJ - 3694 (LCA+tarjan+桥)
题目链接:https://vjudge.net/problem/POJ-3694 具体思路:首先可以通过缩点的方式将整个图变成一个树,并且树的每条边是桥,但是我们可以利用dfn数组将整个图变成树,这样 ...
- Network POJ - 3694(lca并查集+连通图求桥)
就是求出原先图中的桥的数量,在每一次询问时加入一条新边,求加入当前边后图中剩余的桥的数量 求出原先图中的桥的数量,然后减去新加入边的两端点之间的桥的数量,就是剩余桥的数量.. 用并查集把属于同一集合的 ...
- Network POJ - 3694 (连通图标求桥)
有上述两个数组定义可知:对于某点root,其有一儿子v,则有: 1. 如果dfn[root]<=low[v]此点是割点(对于dfs树的根,即最初节点需要两个儿子才是割点) 2. ...
- Network UVA - 315 无向图找割点
题意: 给你一个无向图,你需要找出来其中有几个割点 割点/割项: 1.u不为搜索起点,low[v]>=dfn[u] 2.u为搜索起点,size[ch]>=2 3.一般情况下,不建议在tar ...
- [kuangbin带你飞]专题九 连通图D - Network POJ - 3694
这道题其实也非常简单,只是在求割边及其个数的情况下,每次往里面加入新的边,并再次计算割边的个数. 我们用tarjan可以求出原图的桥以及个数,当然我们不能暴力加边,然后求解,那么如何求呢??? 其实非 ...
- 【POJ 3694】 Network(割边<桥>+LCA)
[POJ 3694] Network(割边+LCA) Network Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 7971 ...
- POJ 3694——Network——————【连通图,LCA求桥】
Network Time Limit:5000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Stat ...
随机推荐
- Python3爬取小说并保存到文件
问题 python课上,老师给同学们布置了一个问题,因为这节课上学的是正则表达式,所以要求利用python爬取小说网的任意小说并保存到文件. 我选的网站的URL是'https://www.biquka ...
- Hbase 手动执行MajorCompation
说明: Major Compaction 的作用: 1.将一个Region下的所有StoreFile合并成一个StoreFile文件 2.对于删除.过期.多余版本的数据进行清除 由于MajorComp ...
- kubernets之Deployment资源
一 声明式的升级应用 1.1 回顾一下kubernets集群里面部署一个应用的形态应该是什么样子的,通过一副简单的图来描述一下 通过RC或者RS里面的模板创建了三个pod,之后通过一个servci ...
- 超详细 安装VMware Workstation,并安装WIN10操作系统连接外网 步骤指导
首先下载VMware Workstation15.1版本,我保存在迅雷链接里面,下载速度非常可观. 链接:https://pan.xunlei.com/s/VMRSt6hHMZXEmPZCm6gJcG ...
- C# 合并和拆分PDF文件
一.合并和拆分PDF文件的方式 PDF文件使用了工业标准的压缩算法,易于传输与储存.它还是页独立的,一个PDF文件包含一个或多个"页",可以单独处理各页,特别适合多处理器系统的工作 ...
- ASP.NET Core错误处理中间件[3]: 异常处理器
DeveloperExceptionPageMiddleware中间件错误页面可以呈现抛出的异常和当前请求上下文的详细信息,以辅助开发人员更好地进行纠错诊断工作.ExceptionHandlerMid ...
- [Usaco2015 dec]Breed Counting
原题链接https://www.lydsy.com/JudgeOnline/problem.php?id=4397 用线段树维护区间和即可.时间复杂度\(O((N+Q)logN)\). #includ ...
- 推荐几个学习Python的免费网站
想要学好Python,只靠看Python相关的书籍是远远不够的!今天为大家分享几个实用的Python学习网站. 欢迎各位热爱Python的小伙伴进群交流:610380249群里有大佬哦,而且很热心,群 ...
- LR_添加系统资源监控失败
1.服务开启情况:RPC.Rmote Resgistry.Network DDE.Server.Workstation.Network connection以上服务是否已开启 2.是否开了防火墙,如有 ...
- SpringIOC的注解应用
SpringIOC的注解应用 在之前的项目中,我们都是通过xml文件进行bean或者某些属性的赋值,其实还有另外一种注解的方式,在企业开发中使用的很多,在bean上添加注解,可以快速的将bean注 ...