题意:求桥

思路:求桥的条件是:(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. MongoDB的"副本“数据库服务器

    1.假设1数据库服务器为活跃服务器(主服务器),2和3为备份服务器,当1出现故障的时候,那么会在2和3中推选出一个(根据权重的等规则)作为活跃服务器,而当1又恢复正常了之后呢,它将以备份服务器的身份出 ...

  2. 洛谷P4035 球形空间产生器 [JSOI2008] 高斯消元

    正解:高斯消元 解题报告: 链接! 昂开始看到以为是,高斯消元板子题? 开始很容易想到的是,虽然是多维但是可以类比二维三维列出式子嘛 但是高斯消元是只能处理一元问题的啊,,,辣怎么处理呢 对的这就是这 ...

  3. 启动spark-shell

    $cd /app/hadoop/spark-1.1.0/bin $spark-shell --master spark://SPARK02:7077 --executor-memory 500m 特别 ...

  4. (3.1)mysql基础深入——mysql二进制与源码目录结构介绍

    (3.1)mysql基础深入——mysql二进制与源码目录结构介绍 关键字:二进制目录结构,源码目录结构(编译安装目录结构) 1.二进制安装程序目录结构 [1] BIN -- mysql的可执行文件( ...

  5. vue.js常用的

    <input v-model.number="age" type="number"> //自动将用户的输入值转为数值类型 <input v-m ...

  6. 最简单的css实现页面宽度自适应

    <div class="rxs"> <div class="rxleft"> 第一段内容,可以是任何html标签 </div> ...

  7. SparkSQL UDF两种注册方式:udf() 和 register()

    调用sqlContext.udf.register() 此时注册的方法 只能在sql()中可见,对DataFrame API不可见 用法:sqlContext.udf.register("m ...

  8. [LeetCode] 589. N-ary Tree Preorder Traversal_Easy

    Given an n-ary tree, return the preorder traversal of its nodes' values. For example, given a 3-ary  ...

  9. X-Forwarded-For 负载均衡 7 层 HTTP 模式获取来访客户端真实 IP 的方法(IIS/Apache/Nginx/Tomcat)

    https://help.aliyun.com/knowledge_detail/13051859.html?pos=1 1.IIS 6 配置方案2.IIS 7 配置方案3.Apache 配置方案4. ...

  10. keras自定义padding大小

    1.keras卷积操作中border_mode的实现 def conv_output_length(input_length, filter_size, border_mode, stride): i ...