本文共 1134 字,大约阅读时间需要 3 分钟。
割边: 在无向图中, 如果删去某条边后,图不再连通,则称该边为割边。
类似于求割点 把 求割点中的 low[v] >= num[u] 改为 low[v] > num[u] 即可。
low[v] >= num[u] 表示 v不可能不经过父节u而回到祖先(包括父亲)
low[v] > num[u] 则在上个条件的基础上 连 父亲节点也回不去了
代码实现如下:
#include#include #define MAXVEX 100#define INF 65535int 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; }