博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 3177 Redundant Paths POJ 3352 Road Construction(双连接)
阅读量:6849 次
发布时间:2019-06-26

本文共 2029 字,大约阅读时间需要 6 分钟。

POJ 3177 Redundant Paths 

POJ 3352 Road Construction

题意:两题一样的。一份代码能交。给定一个连通无向图,问加几条边能使得图变成一个双连通图

思路:先求双连通。缩点后。计算入度为1的个数,然后(个数 + 1) / 2 就是答案(这题因为是仅仅有一个连通块所以能够这么搞,假设有多个,就不能这样搞了)

代码:

#include 
#include
#include
using namespace std;const int N = 1005;const int M = 20005;int n, m;struct Edge { int u, v, id; bool iscut; Edge() {} Edge(int u, int v, int id) { this->u = u; this->v = v; this->id = id; this->iscut = false; }} edge[M];int first[N], next[M], en;void add_edge(int u, int v, int id) { edge[en] = Edge(u, v, id); next[en] = first[u]; first[u] = en++;}void init() { en = 0; memset(first, -1, sizeof(first));}int pre[N], dfn[N], dfs_clock, bccno[N], bccn;void dfs_cut(int u, int id) { pre[u] = dfn[u] = ++dfs_clock; for (int i = first[u]; i + 1; i = next[i]) { if (edge[i].id == id) continue; int v = edge[i].v; if (!pre[v]) { dfs_cut(v, edge[i].id); dfn[u] = min(dfn[u], dfn[v]); if (dfn[v] > pre[u]) edge[i].iscut = edge[i^1].iscut = true; } else dfn[u] = min(dfn[u], pre[v]); }}void find_cut() { dfs_clock = 0; memset(pre, 0, sizeof(pre)); for (int i = 1; i <= n; i++) if (!pre[i]) dfs_cut(i, -1);}void dfs_bcc(int u) { bccno[u] = bccn; for (int i = first[u]; i + 1; i = next[i]) { if (edge[i].iscut) continue; int v = edge[i].v; if (bccno[v]) continue; dfs_bcc(v); }}void find_bcc() { bccn = 0; memset(bccno, 0, sizeof(bccno)); for (int i = 1; i <= n; i++) { if (!bccno[i]) { bccn++; dfs_bcc(i); } }}int du[N];int main() { while (~scanf("%d%d", &n, &m)) { int u, v; init(); for (int i = 0; i < m; i++) { scanf("%d%d", &u, &v); add_edge(u, v, i); add_edge(v, u, i); } find_cut(); find_bcc(); memset(du, 0, sizeof(du)); for (int i = 0; i < en; i += 2) { if (!edge[i].iscut) continue; int u = bccno[edge[i].u], v = bccno[edge[i].v]; if (u == v) continue; du[u]++; du[v]++; } int cnt = 0; for (int i = 1; i <= bccn; i++) if (du[i] == 1) cnt++; printf("%d\n", (cnt + 1) / 2); } return 0;}

版权声明:本文博主原创文章,博客,未经同意不得转载。

你可能感兴趣的文章
js html 事件冒泡
查看>>
LogUtils.java
查看>>
[APP] Android 开发笔记 001-环境搭建与命令行创建项目
查看>>
C语言中数组名作为参数进行函数传递
查看>>
.Net 提交页面,js修改的Label值会丢掉
查看>>
你真的了解UITableViewCell重用吗?
查看>>
httpd-2.2 配置及用法完全攻略
查看>>
Mininet 跑一个简单的ping测试
查看>>
异常处理的解决方案 OneTrueError
查看>>
QSignalMapper类处理多信号关联同一个槽的方法(2)
查看>>
BZOJ1931 : [Shoi2007]Permutation 有序的计数
查看>>
牛客网java基础知识
查看>>
Nginx的端口修改问题
查看>>
vmware里面的名词 vSphere、vCenter Server、ESXI、vSphere Client
查看>>
使用Delaunay三角剖分解决求多边形面积的问题
查看>>
过大年
查看>>
Android Asynchronous Http Client 中文教程
查看>>
带你从零学ReactNative开发跨平台App开发[expo 打包发布](八)
查看>>
Redis系列-存储篇hash主要操作函数小结
查看>>
pycharm如何设置python版本、设置国内pip镜像、添加第三方类库
查看>>