java 求割点_求无向连通图的最小割点详解以及java源代码实现

import java.util.*;

/**寻找割点*/

public class FindArt {

static class Node

{

Node(String name)

{

this.name=name;

Childen=new ArrayList();

}

boolean visited;

int num;

int low;

String name;

Node parent;

List Childen;

public boolean equals(Node node)

{

if(this.name==node.name) return true;

return false;

}

}

public static void main(String args[])

{

Node A=new Node("A");

Node B=new Node("B");

Node C=new Node("C");

Node D=new Node("D");

Node E=new Node("E");

Node F=new Node("F");

Node G=new Node("G");

A.Childen.add(B);

A.Childen.add(D);

B.Childen.add(A);

B.Childen.add(C);

C.Childen.add(B);

C.Childen.add(D);

C.Childen.add(G);

D.Childen.add(A);

D.Childen.add(C);

D.Childen.add(E);

D.Childen.add(F);

E.Childen.add(D);

E.Childen.add(F);

F.Childen.add(D);

F.Childen.add(E);

G.Childen.add(C);

find(A);

count=1;

print(A);

}

private static int count=1;

private static List points=new ArrayList();

private static List mynode=new ArrayList();

public static void find(Node node)

{

List childs=node.Childen;

node.num=count++;

node.low=node.num;

node.visited=true;

for(Node n:childs)

{

if(!n.visited)

{

n.parent=node;

//前向遍历,给每个节点编号

find(n);

//判断是否是割点

if(n.low>=node.num&&node.num!=1)

{

points.add(node);

System.out.println(node.name+"是割点");

}

//后向遍历,计算low

node.low=Math.min(node.low,n.low);

}

else

{

//背向边中num

if(node.parent!=null&&!node.parent.equals(n))

node.low=Math.min(node.low,n.num);

}

}

}

public static void print(Node node)

{

mynode.add(node);

List childs=node.Childen;

System.out.println("name"+node.name+" num:"+node.num+" low:"+node.low);

for(Node n:childs)

{

if(!mynode.contains(n))

{

print(n);

}

}

}

}

5.执行结果

原图:

20c10c12b7438017e04c27a8cffaad60.png

D是割点 C是割点 nameA   num:1  low:1 nameB   num:2  low:1 nameC   num:3  low:1 nameD   num:4  low:1 nameE   num:5  low:4 nameF   num:6  low:4 nameG   num:7  low:7

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值