求图的割边(桥)(邻接矩阵 无向图)C~

来源:互联网 发布:九阴真经捏脸数据 编辑:程序博客网 时间:2024/05/22 17:05

割边: 在无向图中, 如果删去某条边后,图不再连通,则称该边为割边。

类似于求割点 把 求割点中的  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 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;elsee[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;}


原创粉丝点击