POJ 3177 Redundant Paths POJ 3352 Road Construction(双连接)

POJ 3177 Redundant Paths POJ 3352 Road Construction(双连接)

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

POJ 3177 Redundant Paths 

POJ 3352 Road Construction

题目链接

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

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

代码:

#include <cstdio>#include <cstring>#include <algorithm>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;}

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/116888.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 【转载】细聊冗余表数据一致性(架构师之路)

    【转载】细聊冗余表数据一致性(架构师之路)

    2021年11月20日
  • WEBZIP为什么打不开网页

    WEBZIP为什么打不开网页

  • linux快捷键大全_电脑常用的快捷键大全

    linux快捷键大全_电脑常用的快捷键大全Linux常用快捷键,基础菜鸟推荐~

  • 安卓反编译_反编译apk工具

    安卓反编译_反编译apk工具刚刷了自己的小U(下次分享刷机经验),准备美化一下系统,这时需要对framework-res.apk进行编译和反编译,我也是边学习边实践,这里仅作分享。1、安装Java环境JDK↑Android是基于Linux的,而要在安卓上开发,基本上依靠Java为主。因为我们接下来要用到apktool,因此必须安装JDK。注意,JDK和Java环境不同,JDK是开发工具,你可以直接在Java官网下载,并能找…

  • mac系统安装pycharm_mac下载python3

    mac系统安装pycharm_mac下载python3简介pycharm是一款针对python开发的优秀的IDE,以下是针对其在mac上的开发配置使用安装下载链接双击安装并打开应用修改主题pycharm默认的主题并不好看,不过也提供了一些其他的选择,这里我们选择Dacula的主体,设置的路径是Preference->Appearence&Behavior->Appearence效果如下python环境配置py开发当然是…

  • 什么是.so文件_安卓so文件作用

    什么是.so文件_安卓so文件作用so文件是Linux下的程序函数库,即编译好的可以供其他程序使用的代码和数据linux下何谓.so文件:用过windows的同学应该都知道.dll文件吧,这二者有什么共通之处呢,其实.so文件就跟.dll文件差不多 一般来说.so文件就是常说的动态链接库,都是C或C++编译出来的。与Java比较就是:它通常是用的Class文件(字节码) Linux下的.so文件时不能直接运行的,一般来讲,.so文件称为共享库那么.so文件是怎么用的呢?forexample:(1)动态库的编译.

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号