图论

作者: whynotybb | 来源:发表于2018-10-15 16:31 被阅读0次

基于DFS求无向连通图的环

对于每一个连通分量,如果无环则只能是树,即:边数=结点数-1

只要有一个满足      边数   >   结点数-1 原图就有环,环的个数为:边的个数-顶点个数+1;

public Map<Integer,List<Integer>>  getRings(){

//用来记录结点访问状态的数组,0----还未访问;1-----正在进行访问 2------------已访问完

visit=new int[nVerts];

//记录当前结点已经访问过的结点,并记录了父子结点关系

    parent=new int[nVerts];

//用来存储图中的环 

Map<Integer,List<Integer>> ringsMap=new HashMap<>();

//int source=sources.iterator().next();

  int source=1;

visit[source]=1;

stackX.push(source);

int count=0;

int u=source;//记录上一个访问顶点

//标记逆向边的访问

    while (!stackX.isEmpty()){

//int v=getNextUnvisitedVertex1(stackX.peek());

            int v=-1;

u=stackX.peek();

Link current=adjTable.hashArray[u].first;

while (current!=null){

if (visit[current.getId()]==0){

//树边

                    v=current.getId();

break;

}

//u->v逆向边,且满足以下情况:

//1,u和v不是父子关系

//2,u->v首次访问,如果不是首次访问,则ringsMAp中已经包含这两个顶点

                boolean marked=false;

for(List ringSet:ringsMap.values()){

if (ringSet.contains(adjTable.hashArray[u].find(current.getId()).pipeID)){

marked=true;

break;

}

}

if (visit[current.getId()]==1&&parent[u]!=current.getId()

&&parent[current.getId()]!=u&&marked==false){

//回边

//判断该回边是否已经访问u-》v

//  System.out.println("存在环");

//通过parent去反向查找

                    List ring=new ArrayList<>();

ring.add(current.pipeID);//1

                    int p=u;

int last=u;

while (p!=current.getId()){

// ring.add(p);

                        last=p;

p=parent[p];

ring.add(adjTable.hashArray[last].find(p).pipeID);

}

//如果已经有了,就不再输出

                    ringsMap.put(count++,ring);

current=current.next;

}

else {

current=current.next;

}

}

if (v==-1){

visit[stackX.pop()]=2;

}

else {

visit[v]=1;

parent[v]=u;

//  System.out.println(v);

                stackX.push(v);

}

}

//reset

        for (int i=0;i

visit[i]=0;

}

return ringsMap;

}

相关文章

  • <<数学之美>> part5

    摘要: [图论] [网络爬虫] [图的遍历] 图论 说到图论,必须要提的就是KonigsBerg七桥问题,简单说就...

  • 《宇宙猜想》目录

    廿八学会 - 《宇宙图论》只是想将一切看得更清晰些(微信公众号:宇宙猜想) 《宇宙图论》目录 大目录 一、宇宙图论...

  • 《数学之美》笔记 图论与网络爬虫

    离散数学包括数理逻辑,集合论,图论,近世代数。 图论 哥尼斯堡七桥问题(图论的起源):只有每个点的度都是偶数的情况...

  • 美团 EasyReact 源码剖析:图论与响应式编程

    美团 EasyReact 源码剖析:图论与响应式编程 美团 EasyReact 源码剖析:图论与响应式编程

  • 2020-04-03

    一起学习图论 ​最近在学习图论,所以打算写一下图论的浅显概念。 一、起源 普瑞格尔河从古城哥尼斯堡市中心流过,河上...

  • 计划

    docker源码 sdn openflow 图论

  • 图论

    1 最小生成树 1.1 Kruskal算法 选n-1条边 初始化:建立一个边的数组,并根据权值排序。 选边:选择权...

  • 图论

    基于DFS求无向连通图的环 对于每一个连通分量,如果无环则只能是树,即:边数=结点数-1 只要有一个满足 边数 >...

  • 图论

  • 图论

    图的存储结构中有两种:邻接表和矩阵。通常邻接表适用于边比较少的图中(边多,查找效率低),矩阵通常适用于比较稠密的图...

网友评论

      本文标题:图论

      本文链接:https://www.haomeiwen.com/subject/bkivaftx.html