强连通体的GraphX的实现和解析

本文深入探讨了图论中的连通性概念,包括无向图和有向图的连通性定义,如连通图、连通分量、强连通图及强连通分量。详细介绍了判断连通性和强连通性的算法过程,以及通过Spark GraphX实现连通组件和强连通组件的计算。
/**连通体*/
object ConnectComponents {

  /**在图中若从某个顶点Vp出发,沿着一些边经过顶点V1,V2,。。。Vm到达Vg则称顶点序列(Vp,V1,V2....Vm,Vg)为从Vp到Vg的路径,其中Vp是路径的起始点,Vg为路径终点。
   * 路径上的边的数目成为该路径的长度
   * 连通:在无向图中,若从顶点Vi到顶点Vj之间有路径称为这两个顶点是连通的。
   * 连通图:若图中任意一对顶点之间都是连通的,则称为此图为连通图。
   * 连通分量:非连通图中的每个连通部分称为连通分量
   * 强连通:对于有向图,若从顶点Vi到顶点Vj到顶点Vi之间都有路径,则称这两顶点是强连通的。
   * 强连通图:若有向图中任何一对顶点都是强连通的,则此图为强连通图。
   *
   * 性质:
   * 无向连通图,则边E的数目大于等于顶点V的数目减1:|E| >= |V| - 1,反之不成立;
   * 有向强连通图的必要条件是边的数目大于等于顶点的数目:|E| >= |V|,反之不成立。
   * 没有回路的无向图是连通的当且它是树,即等价于:|E| = |V| - 1
   * */
  def conCompts(sc: SparkContext): Unit ={

    val graph = Graph(sc.makeRDD((1L to 7L).map((_,""))),
      sc.makeRDD(Array(Edge(2L,5L,"配偶"),Edge(5L,3L,"亲戚"),Edge(3L,2L,"子女"),Edge(4L,5L,"父母"),Edge(6L,7L,"亲戚")))
    )

    graph
      .connectedComponents()
      .vertices
      .map(_.swap)
      .groupByKey().map(_._2)
      .foreach(println)
  }

  /**强连通:
   * (1)对图中所有节点设定初始连通分支id,用自己的节点id作为所属连通分支的id,并将所有节点打上初始标记false;
   * (2)首先做循
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值