题目传送门

LightOJ 1026

LightOJ 1063

其实是一个模板题,使用Tarjan算法来处理出桥和割点。
dfn[i]是顶点i的时间戳,low[i]是顶点i能够回到的最早的祖先。


割点

  • 是树根,并且可处理的孩子数量>1
  • 不是树根,但是其某个孩子能够访问的最早的祖先的时间戳大于或者等于该点的时间戳

割边

  • 有一顶点u,它的某个孩子v能够访问的最早的祖先的时间戳大于u的时间戳,那么由u和v所组成的边是割边。

代码:

Light OJ 1026

#include <stdio.h>
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <vector>
#include <algorithm>
#include <queue>
#include <map>
#include <string>
#include <math.h>
using namespace std;
typedef pair<int,int> P;
typedef long long LL;
const int INF = 0x3f3f3f3f;
const double PI = acos(-1.0);
const double eps = 1e-9;
const int N = 1e4 + 5;
map<int,int> mp;
struct Edge
{int u,v;int cut;Edge(){}Edge(int _u, int _v):u(_u), v(_v) {cut = 0;}
};
vector<Edge> edges;
vector<int> G[N];
int bridges;
int dfn[N],low[N],dfs_clock;void init()
{for(int i = 0; i < N; i++)G[i].clear();edges.clear();mp.clear();memset(dfn, 0, sizeof(dfn));memset(low, 0, sizeof(low));bridges = 0;dfs_clock = 0;
}bool Hash(int u, int v)
{int tmp = u*10000 + v;if(mp.count(tmp)) return true;mp[tmp] = 1;mp[v*10000+u] = 1;return false;
}void addedge(int u, int v)
{edges.push_back(Edge(u,v));edges.push_back(Edge(v,u));int m = edges.size();G[u].push_back(m-2);G[v].push_back(m-1);
}void dfs(int u, int fa)
{dfn[u] = low[u] = ++dfs_clock;for(int i = 0; i < G[u].size(); i++){Edge &e = edges[G[u][i]];int v = e.v;if(v == fa) continue;if(!dfn[v]){dfs(v,u);low[u] = min(low[u], low[v]);}else{low[u] = min(low[u], dfn[v]);}if(low[v] > dfn[u]){bridges++;e.cut = 1;edges[G[u][i]^1].cut = 1;}}
}int t,kase = 0;
int u,v,m,n;
int main()
{scanf("%d", &t);while(t--){scanf("%d", &n);init();for(int i = 0; i < n; i++){scanf("%d (%d)", &u, &m);for(int j = 0; j < m; j++){scanf("%d", &v);if(!Hash(u,v))addedge(u,v);}}for(int i = 0; i < n; i++)if(!dfn[i])dfs(i,-1);printf("Case %d:\n", ++kase);printf("%d critical links\n", bridges);vector<P> ans;for(int i = 0; i < edges.size(); i++){if(edges[i].cut && edges[i].u < edges[i].v){ans.push_back(make_pair(edges[i].u,edges[i].v));}}sort(ans.begin(),ans.end());for(int i = 0; i < ans.size(); i++){printf("%d - %d\n", ans[i].first, ans[i].second);}}return 0;
}

Light OJ 1063

#include <stdio.h>
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <vector>
#include <algorithm>
#include <queue>
#include <map>
#include <string>
#include <math.h>
using namespace std;
typedef pair<int,int> P;
typedef long long LL;
const int INF = 0x3f3f3f3f;
const double PI = acos(-1.0);
const double eps = 1e-9;
const int N = 1e4 + 5;
struct Edge
{int u,v;Edge(){}Edge(int a, int b):u(a),v(b) {}
};
vector<Edge> edges;
vector<int> G[N];
int cut[N];
int dfn[N], low[N], dfs_clock;
int n,m;
int ans = 0;
void init()
{edges.clear();for(int i = 0; i < N; i++) G[i].clear();memset(cut, 0, sizeof(cut));memset(dfn, 0, sizeof(dfn));memset(low, 0, sizeof(low));dfs_clock = 0;
}void addedge(int u, int v)
{edges.push_back(Edge(u, v));edges.push_back(Edge(v, u));int m = edges.size();G[u].push_back(m-2);G[v].push_back(m-1);
}void dfs(int u, int fa)
{dfn[u] = low[u] = ++dfs_clock;int son = 0;for(int i = 0; i < G[u].size(); i++){Edge &e = edges[G[u][i]];int v = e.v;if(v == fa) continue;if(!dfn[v]){son++;dfs(v, u);low[u] = min(low[u], low[v]);if(u != fa && low[v] >= dfn[u]){cut[u] = 1;}}elselow[u] = min(low[u], dfn[v]);}if(u == fa && son > 1){cut[u] = 1;}}
int t,kase=0;
int main()
{scanf("%d", &t);while(t--){init();scanf("%d%d", &n,&m);for(int i = 0; i < m; i++){int u,v;scanf("%d%d", &u,&v);addedge(u,v);}ans = 0;for(int i = 1; i <= n; i++)if(!dfn[i]) dfs(i, i);for(int i = 1; i <= n; i++)if(cut[i]) ans++;printf("Case %d: %d\n", ++kase, ans);}return 0;
}

转载于:https://www.cnblogs.com/Alruddy/p/7360213.html

LightOJ 1026 桥 1063 割点相关推荐

  1. 连通图的桥(对桥和割点的理解)

    题目链接:https://cn.vjudge.net/problem/UVA-796 顺便总结一下,对于连通图的桥和割点. 首先,从tarjan的角度来说,dfn数组代表的是当前节点的编号,也就是时间 ...

  2. lightoj 1026 无向图 求桥

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1026 #include<cstdio> #include<cstri ...

  3. 算法笔记--无向图的桥、割点、边双连通分量和点双连通分量

    概念: 桥:无向图中删去一条边使得图不再联通,则这条边称为桥 割点:无向图中删去一个点使得图不再联通,则这个点称为割点 算法: 运用到tarjan算法 关于tarjan算法: https://www. ...

  4. 求桥和割点的Tarjan算法

    low[u]定义为u或者u的子树中能够通过非父子边追溯到的最早的节点的DFS开始时间 dfn[u]表示dfs下u的开始时间 割点:无向连通图中,如果删除某点后,图变成不连通,则称该点为割点. 桥:无向 ...

  5. Tarjan求割点桥

    概念 1.桥:是存在于无向图中的这样的一条边,如果去掉这一条边,那么整张无向图会分为两部分,这样的一条边称为桥无向连通图中,如果删除某边后,图变成不连通,则称该边为桥. 2.割点:无向连通图中,如果删 ...

  6. tarjan算法 (割点和桥)

    最近刚学习了tarjan算法,发一篇博客写一下自己的心得和理解. 在了解割点和桥之前,我们先理解什么是双连通. 双连通和强连通分别是应用于无向图和有向图中的,那么在学习双连通之前,请自行学习求强连通分 ...

  7. 图论:桥(割边)和割点

    文章目录 桥 定义 性质 寻找桥 查找桥使用了深度优先遍历(DFS),可否使用广度优先遍历(BFS)? -> 不能! 割点 定义 性质 查找割点 桥 定义 对于无向图,如果删除了一条边,**整个 ...

  8. tarjan求桥、割顶

    若low[v]>dfn[u],则(u,v)为割边.但是实际处理时我们并不这样判断,因为有的图上可能有重边,这样不好处理.我们记录每条边的标号(一条无向边拆成的两条有向边标号相同),记录每个点的父 ...

  9. tarjan算法总结 (强连通分量+缩点+割点),看这一篇就够了~

    文章目录 一.tarjan求强连通分量 1:算法流程 2:模板 二.tarjan缩点 1:相关定义 2:算法流程 三.tarjan求割点.桥 1.什么是割点 2.割点怎么求? 3.割点tarjan模板 ...

最新文章

  1. android 分组 listview,Android实现的ListView分组布局改进示例
  2. MyEclipse Spring 学习总结一 Spring IOC容器
  3. 粽子机器人视频教程_包粽子服务机器人的制作方法
  4. 解决ie6、7 margin-bottom 失效问题
  5. MongoDB基本概念和安装配置
  6. 音视频技术开发周刊 | 187
  7. 论文阅读笔记二十八:You Only Look Once: Unified,Real-Time Object Detection(YOLO v1 CVPR2015)...
  8. python代码规范方面的书_你写的Python代码规范吗?
  9. 从零搭建 ES 搜索服务(六)相关性排序优化
  10. opencv检测相交点_OpenCV学习18--霍夫变换检测直线
  11. python可以连接sql server_python连接sqlserver数据库之一
  12. Excel 相同名称或ID的 内容 合并起来 同列不同内容剃加
  13. 关于发送邮件附件中文文件名称乱码的问题
  14. php消息撤回,“撤回”功能的技术方案设计尝试
  15. cmd命令操作Windows注册表
  16. ECCV 2020 语义分割论文大盘点(38篇论文)
  17. android智能家居ppt,U-home智能家居整体解决方案(PPT 40页)
  18. MTK 调试的奇巧淫技
  19. Android实现APP自动更新
  20. 安装或卸载时出现“called runscript when not marked in progress”的解决办法,亲测有效!不是通过管理员运行Explorer.exe此方法

热门文章

  1. 推荐一个高质量的git命名查询和学习的github仓库git-recipes
  2. linux系统网络对时,Linux系统网络优化【转】
  3. idea 线程内存_Java线程池系列之-Java线程池底层源码分析系列(一)
  4. 句柄 matlab_matlab 整车仿真
  5. 服务器的系统如何入账,云服务器费用如何入账
  6. arch linux键盘布局,Arch Linux的安装、配置、优化及美化(一)
  7. nodejs连接池 连接关闭_「转」连接池居然这么简单?
  8. python枪战项目计划书_人肉(共享)代购项目计划书(示例代码)
  9. 联想昭阳k29轴拆机步骤图_UG8.5编程加工之固定轴曲面轮廓铣削加工方法
  10. winscp登陆windows服务器_基于OpenSSH+WinSCP完成Windows服务器之间的文件传输