信息学奥赛一本通 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;
}
相关推荐
To_OC4 小时前
LC 51 N 皇后:我以为难的是回溯,结果栽在了对角线下标
javascript·算法·leetcode
2401_841495644 小时前
【操作系统】进程同步与互斥实验报告
c++·算法·操作系统·进程·并发·同步·互斥
fqbqrr5 小时前
2607C++,soui与安卓
c++·soui
fqbqrr8 小时前
2607C++,使用微软detours勾挂工具
c++
爱刷碗的苏泓舒9 小时前
PPP-AR 中的参考星选取:数学原理、评价指标与切换处理
算法·gnss·模糊度固定·ppp-ar·星间单差·参考星·卫星端偏差
蓝悦无人机11 小时前
C++基础 — 函数总结
开发语言·c++
烬羽11 小时前
递归老写崩?一个"退回"公式,把回溯题变成填空题
javascript·深度学习·算法
闪电悠米11 小时前
力扣hot100-41.缺失的第一个正数-原地哈希详解
数据结构·算法·哈希算法
星空露珠12 小时前
28种颜色对应名称,
开发语言·数据库·算法·游戏·lua