【问题描述】

给定一个无向图,设计一个算法,判断该图中是否存在关节点,并划分双连通分量。

 package org.xiu68.exp.exp9;

 import java.util.Stack;

 public class Exp9_3 {

     //无向图的双连通分量问题
public static void main(String[] args) {
// TODO Auto-generated method stub
int[][] graph=new int[][]{
{0,1,1,0,0},
{1,0,1,0,0},
{1,1,0,1,1},
{0,0,1,0,1},
{0,0,1,1,0}
};
MGraph1 m=new MGraph1(graph);
m.bicompDFS(0);
//运行结果
/*
双连通部件:
(4,2) (3,4) (2,3)
双连通部件:
(2,0) (1,2) (0,1)
*/
} } //邻接矩阵表示无向图
class MGraph1{
private int vexNum; //顶点数量
private int[][] edges; //边 private Stack<Edge> edgeStack; //边栈
private int[][] visitedEdge; //记录哪条边已经访问过,1为访问过,0为未访问过 private int[] color; //记录顶点的访问状态,-1为未访问到,0为正在搜索中,1为已搜索完成
private int clock; //访问时刻
private int[] pre; //记录顶点的访问时间
private int[] post; //记录顶点的结束访问时刻 public MGraph1(int[][] edges) {
this.edges = edges;
this.vexNum=edges.length;
this.color=new int[vexNum];
this.pre=new int[vexNum];
this.post=new int[vexNum];
this.clock=1;
this.edgeStack=new Stack<>();
this.visitedEdge=new int[vexNum][vexNum]; //初始化所有结点为未访问状态
for(int i=0;i<vexNum;i++){
color[i]=-1;
}
} //返回从v出发,经过一条其后代组成的边包括回退边,所能访问到的顶点的最小的pre值
public int bicompDFS(int v){
//color[v]的值:-1为未访问到,0为正在搜索中,1为已搜索完成
color[v]=0; //顶点v正在搜索中
pre[v]=clock; //顶点v的访问时刻
clock++; int back=pre[v]; //表示从v出发,经过一条其后代组成的边包括回退边,所能访问到的顶点的最小的pre值 for(int i=0;i<vexNum;i++){
if(edges[v][i]==1 && color[i]!=1 && visitedEdge[v][i]!=1){ //顶点v和i之间有边未访问过 edgeStack.push(new Edge(v,i)); //放入边栈中
visitedEdge[v][i]=visitedEdge[i][v]=1; //记录边已访问过 if(color[i]==-1){ //树边
int wBack=bicompDFS(i); if(wBack>=pre[v]){ //说明v的子树没有回路关联到v的祖先
System.out.println("双连通部件: ");
Edge e=edgeStack.pop();
while(true){
System.out.print("("+e.getHead()+","+e.getTail()+") ");
if(e.getHead()==v && e.getTail()==i)
break;
e=edgeStack.pop();
}
System.out.println();
}
if(wBack<back)
back=wBack; //记录从v开始经过的顶点的最小的pre值
}else if(color[i]==0){ //回边
if(pre[i]<back)
back=pre[i]; //记录从v开始经过的顶点的最小的pre值
}
}//if
}//for post[v]=clock;
clock++;
color[v]=1; return back;
}
} class Edge{
private int head; //边的头
private int tail; //边的尾 public Edge(int head,int tail){
this.head=head;
this.tail=tail;
} public int getHead() {
return head;
} public void setHead(int head) {
this.head = head;
} public int getTail() {
return tail;
} public void setTail(int tail) {
this.tail = tail;
} }

Expm 9_3 无向图的双连通分量问题的更多相关文章

  1. POJ 3352 无向图边双连通分量,缩点,无重边

    为什么写这道题还是因为昨天多校的第二题,是道图论,HDU 4612. 当时拿到题目的时候就知道是道模版题,但是苦于图论太弱.模版都太水,居然找不到. 虽然比赛的时候最后水过了,但是那个模版看的还是一知 ...

  2. poj 2942 Knights of the Round Table(无向图的双连通分量+二分图判定)

    #include<cstdio> #include<cstring> #include<cmath> #include<cstdlib> #includ ...

  3. [Tarjan系列] Tarjan算法求无向图的双连通分量

    这篇介绍如何用Tarjan算法求Double Connected Component,即双连通分量. 双联通分量包括点双连通分量v-DCC和边连通分量e-DCC. 若一张无向连通图不存在割点,则称它为 ...

  4. UVALive 3523 Knights of the Round Table 圆桌骑士 (无向图点双连通分量)

    由于互相憎恨的骑士不能相邻,把可以相邻的骑士连上无向边,会议要求是奇数,问题就是求不在任意一个简单奇圈上的结点个数. 如果不是二分图,一定存在一个奇圈,同一个双连通分量中其它点一定可以加入奇圈.很明显 ...

  5. Road Construction(无向图的双连通分量)

    http://poj.org/problem?id=3352 题意:给出一个有n个顶点m条边的无向连通图,问至少添加几条边,使删除任意一条边原图仍连通. 思路:一个边双连通图删除任意一条边仍为连通图. ...

  6. UVALive-5135 Mining Your Own Business (无向图的双连通分量)

    题目分析:在一张无向图中,将一些点涂上黑色,使得删掉图中任何一个点时,每个连通分量至少有一个黑点.问最少能涂几个黑点,并且在涂最少的情况下有几种方案. 题目分析:显然,一定不能涂割点.对于每一个连通分 ...

  7. hdu Caocao's Bridges(无向图边双连通分量,找出权值最小的桥)

    /* 题意:给出一个无向图,去掉一条权值最小边,使这个无向图不再连同! tm太坑了... 1,如果这个无向图开始就是一个非连通图,直接输出0 2,重边(两个节点存在多条边, 权值不一样) 3,如果找到 ...

  8. DFS的运用(二分图判定、无向图的割顶和桥,双连通分量,有向图的强连通分量)

    一.dfs框架: vector<int>G[maxn]; //存图 int vis[maxn]; //节点访问标记 void dfs(int u) { vis[u] = ; PREVISI ...

  9. 无向图的边双连通分量(EBC)

    嗯,首先边双连通分量(双连通分量之一)是:在一个无向图中,去掉任意的一条边都不会改变此图的连通性,即不存在桥(连通两个边双连通分量的边),称作边双连通分量.一个无向图的每一个极大边双连通子图称作此无向 ...

随机推荐

  1. javascript - ie - css - 动态更新鼠标指针形状

    最近写了一个图片展示的页面,在弹出层中显示大图,在大图的左边和右边点击时可以翻页. 将鼠标在大图上移动时,移动到左边显示一个向左的箭头,移动到右边时显示一个向右的箭头. 当第一次显示大图时,如果鼠标位 ...

  2. theano使用

    一  theano内置数据类型 只有thenao.shared()类型才有get_value()成员函数(返回numpy.ndarray)? 1. 惯常处理 x = T.matrix('x') # t ...

  3. windows 2003 IIS FTP 530 home directory inaccessible

    在 Windows Server 2003 及更新的版本中,IIS 中的 FTP 可以使用用户隔离了. 隔离有什么好处呢? 看起来更高级.比如 ftp1 用户打开的时候看到的路径是 /,但内容是自己文 ...

  4. $\mathcal{FFT}$·$\mathcal{Fast \ \ Fourier \ \ Transformation}$快速傅立叶变换

    \(2019.2.18upd:\) \(LINK\) 之前写的比较适合未接触FFT的人阅读--但是有几个地方出了错,大家可以找一下233 啊-本来觉得这是个比较良心的算法没想到这么抽搐这个算法真是将一 ...

  5. java 中自定义类的概述

    作业: 描述商品类 Goods 4个属性 商品名字 大小 价格 库存 把商品类放进集合中 小米品牌 大小 价格 库存的数量 都存集合 华为..... 魅族 public class Goods{ St ...

  6. python爬虫-采集英语翻译

      http://fanyi.baidu.com/?aldtype=85#en/zh/drughttp://fanyi.baidu.com/?aldtype=85#en/zh/cathttp://fa ...

  7. JavaEE学习总结(十六)— Servlet

    一.Servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术. Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向 ...

  8. Hadoop记录-MRv2(Yarn)运行机制

    1.MRv2结构—Yarn模式运行机制 Client---客户端提交任务 ResourceManager---资源管理 ---Scheduler调度器-资源分配Containers ----在Yarn ...

  9. C# 网络常用操作类NetHelper.cs

    一个非常完整的网络操作帮助类,包含20多个常用方法,例如: IP地址的验证以及截取. 端口的验证. 电子邮件的发送. 获取计算机名. IP地址的获取以及TCP. UDP连接的创建和数据发送等. usi ...

  10. 运用Zabbix实现内网服务器状态及局域网状况监控(3) —— Zabbix服务端安装

    1. Zabbix服务端安装,基于LNMP PHP5.5+Nginx1.9安装配置:http://www.cnblogs.com/vurtne-lu/p/7707536.html MySQL5.5编译 ...