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 ...
随机推荐
- HDU6375双端队列
要点分析: 1.本题可以使用C++STL中的deque双端队列来方便解决(底层是一个双向的链表) 2.值得注意的是N的上限为150000,所以直接开这么大的空间会超内存,可以配合map一起使用 关于双 ...
- Python——绘制埃菲尔铁塔
from turtle import * import turtle colormode(255) #设置turtle颜色模式 speed(0) #速度 setup(800,800,720,0) #画 ...
- (十五)xml模块
xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,不过在json还没诞生的黑暗年代,大家只能选择用xml呀,至今很多传统公司如金融行业的很多系统的接口还主要 ...
- SDUST数据结构 - chap8 查找
选择题: 函数题: 6-1 二分查找: 裁判测试程序样例: #include <stdio.h> #include <stdlib.h> #define MAXSIZE 10 ...
- Kubernetes CoreDNS 状态是 CrashLoopBackOff 报错
查看状态的时候,遇见coredns出现crashlookbackoff,首先我们来进行排错,不管是什么原因,查看coredns的详细信息,以及logs [root@k8s-master coredns ...
- SAP 技术设置(technical setting)
在创建数据库表的时候,需要设置它的技术参数:这样才能使用. 在技术设置里,有个数据类(data class),如APPL0,等等. 有好多值可以供我们选择.这些值保存在表DDART中,表的描述:DD: ...
- 注解 @AutoConfigureBefore 和 @AutoConfigureAfter 的用途
注解 @AutoConfigureBefore 和 @AutoConfigureAfter 的用途 介绍: 如果你想将在SpringBoot项目中的配置类进行排序,那么用到spring-boot-au ...
- uni-app开发经验分享十一: uniapp iOS云打包修改权限提示语
打包提交appstore如果用到了如下权限需要修改提示语,详细描述使用这个权限的原因,如不修改提示语appstore审核可能会被拒绝.Apple的原则是,如果一个app想要申请用户同意某个隐私信息访问 ...
- TCP客户端程序
TCP客户端程序的函数调用顺序为:socket -> connect -> send/recv socket.send和recv函数在TCP服务器程序中已经说过了,这里就不赘述了. con ...
- CentOS7,非LVM根分区扩容步骤:
1.查看现有的分区大小 非LVM分区,目前磁盘大小为40G,根分区总容量为40G,(是自定义分区安装的) 2.关机增加磁盘大小至100G 如果你们是vmwaer虚拟软件安装的那如下入扩容: 3.查看磁 ...