信息学奥赛一本通 1524:旅游航道

【题目链接】

ybt 1524:旅游航道

【题目考点】

1. 图论:割边(桥)

【解题思路】

一个星球是一个顶点,一条航道是一条无向边,任意两星球之间可以通过航道到达,说明该图是连通图。可以认为输入数据中没有重边和自环。

"如果某一条航道的删除使得一些星球不能到达,那么这条航道是不能删除的,称之为「主要航道」",显然主要航道就是桥。

该题求一个连通图的桥的数量,使用tarjan算法可以完成。

【题解代码】

解法1:tarjan算法求桥

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
#define N 30005
int m, n, fa[N], dfn[N], low[N], ts, ans;
vector<int> edge[N];
void tarjan(int u)
{
	dfn[u] = low[u] = ++ts;
	for(int v : edge[u])
	{
		if(dfn[v] == 0)
		{
			fa[v] = u;
			tarjan(v);
			low[u] = min(low[u], low[v]);
			if(dfn[u] < low[v])
				ans++;
		}
		else if(v != fa[u])
			low[u] = min(low[u], dfn[v]);
	}
}
int main()
{
	int a, b;
	while(cin >> n >> m && n && m)//n是顶点数 m是边数  
	{
		memset(dfn, 0, sizeof(dfn));
		memset(fa, 0, sizeof(fa));
		ans = 0;
		for(int i = 1; i <= n; ++i)
			edge[i].clear();
		for(int i = 1; i <= m; ++i)
		{
			cin >> a >> b;
			edge[a].push_back(b);
			edge[b].push_back(a);
		}
		tarjan(1);//连通图只需要调用一次
		cout << ans << endl; 
	}
	return 0;
}
相关推荐
a1879272183139 分钟前
【算法】动态规划第四篇:背包收官——min 哨兵、计数世界与组合排列分水岭
算法·leetcode·动态规划·dp·01背包·算法讲解·决策合并
2601_962297481 小时前
在python3中、下列输出变量a的正确写法是_2020超星大数据Python免费答案
数据结构·python·算法·编程·字符串操作
辰烨chenye1 小时前
LeetCode Hot 100 题解 · 子串篇
算法·leetcode·职场和发展
辰烨chenye1 小时前
LeetCode Hot 100 题解 · 堆篇
java·算法·leetcode
手写码匠1 小时前
华为云Flexus+DeepSeek征文|DeepSeek 应用监控告警体系实战:从“用户投诉才知道“到“故障前就发现“
人工智能·深度学习·算法·aigc
shehuiyuelaiyuehao2 小时前
算法29,前缀和,除自身以外的数组的乘积
java·数据结构·算法
智购科技自动售货机厂家2 小时前
2026自动售货机设备清洁效果自动验证:从图像比对到评分算法的工程实践~YH
人工智能·算法·计算机视觉
爱吃巧克力的程序媛2 小时前
main.cpp注册 C++ 类到 QML 元对象系统
c++·qt
YYYing.3 小时前
【C++进阶系列 (二)】关于线程堆栈的那些事——函数调用过程
开发语言·c++·函数·线程堆栈
姜穆澜3 小时前
机器学习实战指南:从算法原理到工程落地
人工智能·算法·机器学习