【题目链接】
【题目考点】
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;
}