割边: 在无向图中, 如果删去某条边后,图不再连通,则称该边为割边。
类似于求割点 把 求割点中的 low[v] >= num[u] 改为 low[v] > num[u] 即可。
low[v] >= num[u] 表示 v不可能不经过父节u而回到祖先(包括父亲)
low[v] > num[u] 则在上个条件的基础上 连 父亲节点也回不去了
代码实现如下:
#include<stdio.h>
#include<stdlib.h>
#define MAXVEX 100
#define INF 65535
int num[MAXVEX] = {0}, low[MAXVEX];
int e[MAXVEX][MAXVEX];
int child, index;
int n, m;
int cnt;
int min(int a, int b)
{
return a < b ? a : b;
}
void dfs(int cur, int father)
{
int i;
index++;
num[cur] = index;
low[cur] = index;
child = 0;
for(i = 1; i <= n; i++ ){
if(e[cur][i] == 1){
if(num[i] == 0){
child++;
dfs(i, cur);
low[cur] = min(low[cur], low[i]);
if(low[i] > num[cur]){
printf("\t%d-%d\n",cur, i);
cnt++;
}
}
else if(i != father){
low[cur] = min(low[cur], num[i]);
}
}
}
}
int main()
{
int i, j, x, y;
scanf("%d%d",&n,&m);
for(i = 1; i <= n; i++ ){
for(j = 1; j < n; j++ ){
if(i == j)
e[i][j] = 0;
else
e[i][j] = INF;
}
}
cnt = 0;
index = 0;
for(i = 1; i <= m; i++ ){
scanf("%d%d",&x,&y);
e[x][y] = 1;
e[y][x] = 1;
}
printf("\n割边: \n");
dfs(1, 1);
printf("\n共有%d条 ",cnt);
return 0;
}