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;}

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

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Python实现人脸识别「建议收藏」

    Python实现人脸识别「建议收藏」案例分析概述Python在人脸识别方面功能很强大,程序语言简单高效,下面编程实现一下如何实现人脸识别。分别给出实现代码,作为学习和技术交流。Python基础环境准备参见:https://blog.csdn.net/yan_dk/article/details/89528463案例实现打开显示图片importcv2#opencv库#读…

    2025年5月31日
    0
  • php7使用curl扩展「建议收藏」

    php7使用curl扩展「建议收藏」  前言:最近项目中要调用一些接口,看到网上很多都使用curl,但由于刚开始,php很多的语法都不是很熟悉,例如如何调用第三方函数等,为了使用curl_init()等函数,从安装php的扩展curl开始踩了很多坑,对于环境安装真的是比较头疼的事情,往往可能因为一些小问题而不成功,而且按照网上乱七八糟的博客说的做,真的一点用都没有,特此记录一下,希望以后的编程生涯中尽量少犯这种错误。首先给出环境…

    2022年10月21日
    0
  • linux 通过crt直接上传和下载文件和文件

    linux 通过crt直接上传和下载文件和文件linux 通过crt直接上传和下载文件和文件

    2022年4月23日
    66
  • fastjson的JSONArray和JSONObject[通俗易懂]

    fastjson的JSONArray和JSONObject[通俗易懂]什么是JSON?JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于javascriptProgrammingLanguage,StandardECMA-2623rdEdition-December1999的一个子集。JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言

    2022年6月7日
    54
  • C51单片机–定时器实验

    C51单片机–定时器实验定时器文章目录定时器一、将交通灯实验中数码管倒计时1s改为定时器实现二、引入矩阵键盘,可以对路口红绿灯变换时间进行设置一、将交通灯实验中数码管倒计时1s改为定时器实现这个代码感觉逻辑上没问题,实际仿真出来倒计时的1s感觉要比实际的慢,可能是由于单片机执行语句时也需要耗费时间实验仿真图如下代码如下(示例):#include<reg51.h>#include<intrins.h>#defineuintunsignedint#defineucharun

    2022年7月16日
    12
  • 最速下降法收敛速度快还是慢_最速下降法是全局收敛算法吗

    最速下降法收敛速度快还是慢_最速下降法是全局收敛算法吗\qquad已知设步长为α\alphaα,下降方向为ddd,f(xk+αd)f(x_{k}+\alphad)f(xk​+αd)在xkx_{k}xk​的TaylorTaylorTaylor展示为f(xk+1)=f(xk+αd)=f(xk)+αgkTd+O(∣∣αd∣∣2)f(x_{k+1})=f(x_{k}+\alphad)=f(x_{k})+\alphag_{k}^{T}d+O(||\…

    2025年6月3日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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