题意:求桥

思路:求桥的条件是:(u,v)是父子边时 low[v]>dfn[u]

所以我们要解决的问题是怎么判断u,v是父子边(也叫树枝边)。我们在进行dfs的时候,要加入一个fa表示当前进行搜索的点的父节点。v=edge[v].v,如果dfn[v]==0即没访问过,那么肯定是父子边;如果v已经被访问过,我们就要做出筛选,只有v!=fa才进行low[u]=min(low[u],dfn[v]),因为v==fa时,(u,v)变成了返祖边,这时候low[u]被刷新成为fa的dfn,但是low是通过父子边所能找到的最早节点,固要舍去这种情况。

无向连通图的割点、桥

code:

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<queue>
#include<cmath>
#include<string>
#include<map>
#include<stack>
#include<set>
#include<vector>
#include<iostream>
#include<algorithm>
#include<sstream>
#define ll long long
const int N=1e5+5;
const ll INF=1e5+5;
using namespace std;
int n,m,cnt,ecnt,num;
int dfn[N],low[N],head[N];
vector<int> g[N];
struct Edge{
int u,v,next;
}edge[N*10];
struct Ans{
int u,v;
}ans[N*10];
int cmp(Ans a,Ans b){
if(a.u<b.u) return 1;
else if(a.u==b.u && a.v<b.v) return 1;
return 0;
}
void add(int u,int v){
edge[num].u=u;
edge[num].v=v;
edge[num].next=head[u]; //表头
head[u]=num++;
} void tarjan(int x,int fa){ //fa是x的父节点
dfn[x]=low[x]=++cnt;
for(int i=head[x];i!=-1;i=edge[i].next){
int v=edge[i].v;
if(!dfn[v]){
tarjan(v,x);
low[x]=min(low[x],low[v]);
if(low[v]>dfn[x]){
int a,b;
a=x,b=v;
if(a>b) swap(a,b);
ans[ecnt].u=a,ans[ecnt].v=b;
ecnt++;
}
}
else if(v!=fa){
low[x]=min(low[x],dfn[v]);
} }
}
void init(){
cnt=ecnt=num=0;
memset(head,-1,sizeof(head));
memset(dfn,0,sizeof(dfn));
memset(low,0,sizeof(low));
}
int main(){
int t,T,a,b,n;
while(~scanf("%d",&t)){
init();
T=t;
while(T--){
scanf("%d (%d)",&a,&n);
while(n--){
scanf("%d",&b);
add(a,b);
}
}
for(int i=0;i<t;i++){
if(!dfn[i]) tarjan(i,i);
}
sort(ans,ans+ecnt,cmp);
cout<<ecnt<<" critical links"<<endl;
for(int i=0;i<ecnt;i++){
printf("%d - %d\n",ans[i].u,ans[i].v);
}
cout<<endl;
}
return 0;
}

这是在加边的时候判断是否重边

code2:

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<queue>
#include<cmath>
#include<string>
#include<map>
#include<stack>
#include<set>
#include<vector>
#include<iostream>
#include<algorithm>
#include<sstream>
#define ll long long
const int N=1e5+5;
const ll INF=1e5+5;
using namespace std;
int n,m,cnt,ecnt,num;
int dfn[N],low[N],head[N];
vector<int> g[N];
struct Edge{
int u,v,next;
int flag;
}edge[N*10];
struct Ans{
int u,v;
}ans[N*10];
int cmp(Ans a,Ans b){
if(a.u<b.u) return 1;
else if(a.u==b.u && a.v<b.v) return 1;
return 0;
}
void add(int u,int v){
for(int i=head[u];i!=-1;i=edge[i].next){
if(edge[i].v==v){ //说明不是桥
edge[i].flag++;
edge[num].u=u;
edge[num].v=v;
edge[num].flag=1;
edge[num].next=head[u]; //表头
head[u]=num++;
return;
}
}
edge[num].u=u;
edge[num].v=v;
edge[num].flag=0;
edge[num].next=head[u]; //表头
head[u]=num++;
} void tarjan(int x,int fa){ //fa是x的父节点
dfn[x]=low[x]=++cnt;
for(int i=head[x];i!=-1;i=edge[i].next){
int v=edge[i].v;
if(v==fa) continue;
if(!dfn[v]){
tarjan(v,x);
low[x]=min(low[x],low[v]);
if(low[v]>dfn[x] && edge[i].flag==0){
int a,b;
a=x,b=v;
if(a>b) swap(a,b);
ans[ecnt].u=a,ans[ecnt].v=b;
ecnt++;
}
}
else{
low[x]=min(low[x],dfn[v]);
} }
}
void init(){
cnt=ecnt=num=0;
memset(head,-1,sizeof(head));
memset(dfn,0,sizeof(dfn));
memset(low,0,sizeof(low));
}
int main(){
int t,T,a,b,n;
while(~scanf("%d",&t)){
init();
T=t;
while(T--){
scanf("%d (%d)",&a,&n);
while(n--){
scanf("%d",&b);
add(a,b);    //这里不能加add(b,a),在读到b时会加这条边,否则在下一次add(b,a)会判重边
}
}
for(int i=0;i<t;i++){
if(!dfn[i]) tarjan(i,i);
}
sort(ans,ans+ecnt,cmp);
cout<<ecnt<<" critical links"<<endl;
for(int i=0;i<ecnt;i++){
printf("%d - %d\n",ans[i].u,ans[i].v);
}
cout<<endl;
}
return 0;
}

UVA796 Critical Links(求桥) 题解的更多相关文章

  1. [UVA796]Critical Links(割边, 桥)

    题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...

  2. UVA796 - Critical Links(Tarjan求桥)

    In a computer network a link L, which interconnects two servers, is considered critical if there are ...

  3. UVA796 Critical Links —— 割边(桥)

    题目链接:https://vjudge.net/problem/UVA-796 In a computer network a link L, which interconnects two serv ...

  4. uva-796.critical links(连通图的桥)

    本题大意:求出一个无向图的桥的个数并且按照顺序输出所有桥. 本题思路:注意判重就行了,就是一个桥的裸题. 判重思路目前知道的有两种,第一种是哈希判重,第二种和邻接矩阵的优化一样,就是只存图的上半角或者 ...

  5. Uva 796 Critical Links 找桥

    这个题很简单,但是输入有毒,用字符串的我一直RE 然后换成这样瞬间AC #include <stdio.h> #include <string.h> #include < ...

  6. Uva796 Critical Links

    用tarjan缩点 然后用dfn[u] < low[v]缩点并且保存起来 在sort一遍输出 #include<stdio.h> #include<string.h> # ...

  7. UVA796:Critical Links(输出桥)

    Critical Links 题目链接:https://vjudge.net/problem/UVA-796 Description: In a computer network a link L, ...

  8. uva 796 C - Critical Links(tarjan求桥)

    题目链接:https://vjudge.net/contest/67418#problem/C 题意:求出桥的个数并且按顺序输出 题解:所谓桥就是去掉这条边后连通块增加,套用一下模版就行. #incl ...

  9. UVA 796 Critical Links(Tarjan求桥)

    题目是PDF就没截图了 这题似乎没有重边,若有重边的话这两点任意一条边都不是桥,跟求割点类似的原理 代码: #include <stdio.h> #include <bits/std ...

随机推荐

  1. automation轻松“一点”,搞定裸机安装系统

    企业在新建数据中心.新业务上线.老业务扩容等场景下,会采购一批新的裸机服务器,在新服务器投入使用之前,势必得进行操作系统的安装.相信每个人都有安装操作系统的经历,BIOS设置.磁盘分区.驱动安装... ...

  2. 解决eslint空格报错等问题

    eslint检查代码风格是好的,不过 有些换行报错   空格报错  还有在代码中有 console也是报错   这有些烦人 为了把这些烦人的报错给禁止掉 我们可以在package.json文件中 找到 ...

  3. 洛谷P1494小Z的袜子 [国家集训队] 莫队

    正解:莫队 解题报告: 这是,传送门qwq 昂大概是莫队板子题? 首先可以推出来答案是(∑C(2,color[i]))/C(2,r-l+1)趴?挺显然的不解释了qwq 然后显然除数直接做就成,考虑怎么 ...

  4. 【Python】【亲测好用】安装第三方包报错:AttributeError:'module' object has no attribute 'main'

    安装/卸载第三包可能出现如下问题及相应解决办法: 在pycharm编辑中,使用anconda2更新.卸载第三方包时,出现如下错误: AttributeError:'module' object has ...

  5. uvloop —— 超级快的 Python 异步网络框架

    简短介绍 asyncio是遵循Python标准库的一个异步 I/O框架.在这篇文章里,我将介绍 uvloop: 可以完整替代asyncio事件循环.uvloop是用Cython写的,基于 libuv. ...

  6. testng入门教程6 TestNG忽略测试

    有时,我们的代码是没有准备好,如果测试用例写入到测试方法/代码将无法运行,在这种情况下,@Test(enabled = false)有助于禁用此测试案例. 测试方法是标注了@Test(enabled ...

  7. iOS UI基础-3.0图片浏览器及plist使用

    需求: 1.显示当前图片序号/总图片数 2.显示图片 3.上一张图片.下一张图片转换 4.显示图片描述 下面用代码来实现 // // UYViewController.m // 3.0图片查看器 // ...

  8. Canvas标签基础

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. Perl中的哈希(四)

    Perl中的哈希数据结构.相比较于数组,这种数据结构对于数据查找和统计更加方便. 一个特殊的哈希,%ENV,表示当前terminal下,通过setenv设置的variable的键值. 键:环境变量名, ...

  10. 20154312 曾林 Exp3 免杀原理与实践

    20154312 曾林 0.写在前面 AV厂商检测恶意软件的方式主流的就三种: 基于特征码的检测 启发式恶意软件检测 基于行为的恶意软件检测 我们要做的就是让我们的恶意软件没法被这三种方式找到,也就是 ...