图的割边

来源:互联网 发布:单片机485接口电路 编辑:程序博客网 时间:2024/04/30 08:54
//图的割边定义与图的割点类似,即去掉某条边之后,剩余的顶点之间不能相互之间到达,其实质就是将公式里的low[v]>=num[u]的等号去掉,因为"="说明能到
//父节点,而父节点是被去掉的(不包含在剩余的点里),所以哪怕“=”也成立,而割边就是连父节点都到不了,所以改成low[v]>num[u]
//另外值得注意的是在割点中,有一种特殊情况就是根节点之下只有一个子节点,这样不是割点,但它属于割边,所以不需要分类讨论~~
#include <stdio.h>int a[101][101];int n;int num[101];int low[101];int index;int min(int a,int b){  return a<b?a:b;}int dfs(int cur,int father){    int i;    index++;    num[cur]=index;    low[cur]=index;    for (i=1;i<=n;i++)    {        if (a[i][cur]==1)    {        if (num[i]==0)//如果还没有被访问过,说明是cur的子节点    {        dfs(i,cur);        low[cur]=min(low[i],low[cur]);//如果子节点的low小,说明子节点还与其他祖先节点相连        if (low[i]>num[cur])        printf("%d-%d\n",cur,i);    }    else if (i!=father)   low[cur]=min(low[cur],num[i]);//如果是祖先节点,那么更新num    }    }return;} int main() {     int i,m,j,x,y;     scanf("%d%d",&n,&m);     for (i=1;i<=n;i++)        for (j=1;j<=n;j++)        a[i][j]=0;     for (i=1;i<=m;i++)     {         scanf("%d%d",&x,&y);         a[x][y]=1;         a[y][x]=1;     }     dfs(1,1);     return 0;}


0 0
原创粉丝点击