**通过深度优先算法来找出有向图的树边,后向边,前向边,横跨边(Java实现)

**

package graph;import java.io.IOException;
import java.util.Scanner;public class ListCycle
{private class ENode {int ivex;       // 该边所指向的顶点的位置ENode nextEdge; // 指向下一条弧的指针}// 邻接表中表的顶点private class VNode {int color;//顶点颜色;int d;//初始时间戳;int f;//结束时间戳;char data;          // 顶点信息ENode firstEdge;    // 指向第一条依附该顶点的弧VNode pre;};int time;private VNode[] mVexs;  // 顶点数组/* * 创建图(自己输入数据)*/public ListCycle() {// 输入"顶点数"和"边数"System.out.printf("input vertex number: ");int vlen = readInt();System.out.printf("input edge number: ");int elen = readInt();if ( vlen < 1 || elen < 1 || (elen > (vlen*(vlen - 1)))) {System.out.printf("input error: invalid parameters!\n");return ;}// 初始化"顶点"mVexs = new VNode[vlen];for (int i = 0; i < mVexs.length; i++) {System.out.printf("vertex(%d): ", i);mVexs[i] = new VNode();mVexs[i].data = readChar();mVexs[i].firstEdge = null;}// 初始化"边"//mMatrix = new int[vlen][vlen];for (int i = 0; i < elen; i++) {// 读取边的起始顶点和结束顶点System.out.printf("edge(%d):", i);char c1 = readChar();char c2 = readChar();int p1 = getPosition(c1);int p2 = getPosition(c2);// 初始化node1ENode node1 = new ENode();node1.ivex = p2;// 将node1链接到"p1所在链表的末尾"if(mVexs[p1].firstEdge == null)mVexs[p1].firstEdge = node1;elselinkLast(mVexs[p1].firstEdge, node1);}}/** 创建图(用已提供的矩阵)** 参数说明:*     vexs  -- 顶点数组*     edges -- 边数组*/public ListCycle(char[] vexs, char[][] edges) {// 初始化"顶点数"和"边数"int vlen = vexs.length;int elen = edges.length;// 初始化"顶点"mVexs = new VNode[vlen];for (int i = 0; i < mVexs.length; i++) {mVexs[i] = new VNode();mVexs[i].data = vexs[i];mVexs[i].firstEdge = null;}// 初始化"边"for (int i = 0; i < elen; i++) {// 读取边的起始顶点和结束顶点char c1 = edges[i][0];char c2 = edges[i][1];// 读取边的起始顶点和结束顶点int p1 = getPosition(edges[i][0]);int p2 = getPosition(edges[i][1]);// 初始化node1ENode node1 = new ENode();node1.ivex = p2;// 将node1链接到"p1所在链表的末尾"if(mVexs[p1].firstEdge == null)mVexs[p1].firstEdge = node1;elselinkLast(mVexs[p1].firstEdge, node1);}}/** 将node节点链接到list的最后*/private void linkLast(ENode list, ENode node) {ENode p = list;while(p.nextEdge!=null)p = p.nextEdge;p.nextEdge = node;}/** 返回ch位置*/private int getPosition(char ch) {for(int i=0; i<mVexs.length; i++)if(mVexs[i].data==ch)return i;return -1;}/** 读取一个输入字符*/private char readChar() {char ch='0';do {try {ch = (char)System.in.read();} catch (IOException e) {e.printStackTrace();}} while(!((ch>='a'&&ch<='z') || (ch>='A'&&ch<='Z')));return ch;}/** 读取一个输入字符*/private int readInt() {Scanner scanner = new Scanner(System.in);return scanner.nextInt();}/** 深度优先搜索遍历图的递归实现*/private void DFS_visit(int i, boolean[] visited) {ENode node;//time= time+1;mVexs[i].d = ++time;mVexs[i].color=0;//1表示该节点颜色为灰色visited[i] = true;//System.out.printf("%c(%d) ", mVexs[i].data,mVexs[i].d);//颜色node = mVexs[i].firstEdge;while (node != null) {if (mVexs[node.ivex].color == -1) {System.out.println("("+i+","+node.ivex+")---树边");DFS_visit(node.ivex, visited);  }else if(mVexs[node.ivex].color == 0){System.out.println("("+i+","+node.ivex+")---后向边");}else{if(mVexs[i].color < mVexs[node.ivex].d)System.out.println("("+i+","+node.ivex+")---前向边");else if(mVexs[i].color > mVexs[node.ivex].d)System.out.println("("+i+","+node.ivex+")---横跨边");}     node = node.nextEdge;}mVexs[i].color=1;//time=time+1;mVexs[i].f = ++time;//System.out.printf("%c(%d) ", mVexs[i].data,mVexs[i].f);}/** 深度优先搜索遍历图*/public void DFS() {time = 0;boolean[] visited = new boolean[mVexs.length];       // 顶点访问标记// 初始化所有顶点都没有被访问for ( int i = 0; i <mVexs.length; i++){mVexs[i].color = -1;//初始化所有顶点都为白色mVexs[i].pre=null;visited[i] = false;}// System.out.printf("DFS: ");for (int j= 0; j < mVexs.length; j++) {if (!visited[j])DFS_visit(j, visited);}System.out.printf("\n");}/** 打印矩阵队列图*/public void print() {System.out.printf("List Graph:\n");for (int i = 0; i < mVexs.length; i++) {System.out.printf("%d(%c): ", i, mVexs[i].data);ENode node = mVexs[i].firstEdge;while (node != null) {System.out.printf("%d(%c) ", node.ivex, mVexs[node.ivex].data);node = node.nextEdge;}System.out.printf("\n");}}public static void main(String[] args) {char[] vexs = {'A', 'B', 'C', 'D', 'E', 'F', 'G'};char[][] edges = new char[][]{{'A', 'B'}, {'B', 'C'}, {'B', 'E'}, {'B', 'F'}, {'C', 'E'}, {'D', 'C'}, {'E', 'B'}, {'E', 'D'}, {'F', 'G'}}; ListCycle pG;// 自定义"图"(输入矩阵队列)//pG = new ListDG();// 采用已有的"图"pG = new ListCycle(vexs, edges);pG.print();   // 打印图pG.DFS();     // 深度优先遍}}

通过深度优先算法来找出有向图的树边,后向边,前向边,横跨边相关推荐

  1. 算法期中1007. 怪兽训练 (找出有向图中所有的强连通分量的Kosaraju算法)

    Description 贝爷的人生乐趣之一就是约战马会长. 他知道马会长喜欢和怪兽对决,于是他训练了N只怪兽,并对怪兽用0到N-1的整数进行编号. 贝爷训练怪兽的方式是让它们一对一互殴. 两只怪兽互殴 ...

  2. 数据结构第5章例题 若矩阵Am×n中存在某个元素aij满足:aij是第i行中的最小值且是第j列中的最大值,则称该元素为矩阵A的一个鞍点。试编写一个算法,找出A中的所有鞍点。

    [例5.1] 若矩阵Am×n中存在某个元素aij满足:aij是第i行中的最小值且是第j列中的最大值,则称该元素为矩阵A的一个鞍点.试编写一个算法,找出A中的所有鞍点. 算法如下: void saddl ...

  3. 【Python】最长括号匹配问题:给定字符串,仅包含左括号‘(’和右括号‘)’,它可能不是括号匹配的,设计算法,找出最长匹配的括号子串

    最长括号匹配 示例: 给定字符串,仅包含左括号'('和右括号')',它可能不是括号匹配的,设计算法,找出最长匹配的括号子串. 算法分析 只有在右括号和左括号发生匹配时,才有可能更新最终解. 计算s[0 ...

  4. 给定一个含n(n≥1)个整数的数组,请设计一个在时间上尽可能高效的算法,找出数组中未出现的最小正整数。

    笔者初涉<算法设计与分析>这门专业课,在做一些算法设计题的过程中遇到一些小感悟,特此记录和大家分享. 下面直接给出算法题目: 给定一个含n(n≥1)个整数的数组,请设计一个在时间上尽可能高 ...

  5. 典型的Top K算法_找出一个数组里面前K个最大数

    原文 典型的Top K算法_找出一个数组里面前K个最大数...或找出1亿个浮点数中最大的10000个...一个文本文件,找出前10个经常出现的词,但这次文件比较长,说是上亿行或十亿行,总之无法一次读入 ...

  6. 请设计一个既节省时间又节省空间的算法来找出该链表中的倒数第m个元素

    给定一个单向链表(长度未知),请设计一个既节省时间又节省空间的算法来找出该链表中的倒数第m个元素. 实现这个算法,并为可能出现的特例情况安排好处理措施. 倒数第m个元素"是这样规定的:当m= ...

  7. 算法试题 - 找出最小 k 个数

    题目 题目:输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 解析 思路1 这一题应用堆排序算法复杂度只有O(nlog k), ...

  8. 漫画算法:找出缺失的整数

    转载自 玻璃猫 程序员小灰 小灰一边回忆一边讲述起当时面试的情景...... 题目:一个无序数组里有99个不重复正整数,范围从1到100,唯独缺少一个整数.如何找出这个缺失的整数? 解法一: 创建一个 ...

  9. 【实习笔试面试题】2013网易互联网实习笔试算法题-找出最大连续自然数个数

    找出最大连续自然数个数 搜集者:江南烟雨 E-Mail:xiajunhust@gmail.com 本题为网易互联网暑期实习生笔试算法题. 凭记忆记录下来的题目,如违反网易版权请邮件联系,本人会删除. ...

最新文章

  1. 动力节点的课堂笔记_男孩把历史笔记画成“漫画”,同学成小粉丝,网友:别人家的孩子...
  2. 【大版本】Adobe PDF控件ABCpdf V11发布 | 附下载
  3. 凤翅医话——小青龙加石膏汤
  4. 【mmdetection】参数解析 转载
  5. C语言中的一维数组和二维数组
  6. GoldenGate for Java adapter介绍二(代码篇)
  7. VQEG(视频质量专家组)
  8. Redis系列(二):Redis缓存穿透和缓存雪崩是什么?
  9. ROS中阶笔记(一):机器人系统设计—ROS系统下连接外部传感器
  10. HDU 4558 剑侠情缘
  11. 导出函数__declspec(dllexport)
  12. springboot test
  13. Android开发之音乐播放器
  14. 数据库之战| 寻找你心中的数据库漫威英雄
  15. 5.3 使用数据结构对真实世界建模
  16. Kiwi for Gmail Mac(mac gmail邮箱客户端)
  17. heap exploitation巩固——堆中的off-by-one
  18. Windows-EFS加密文件
  19. 兵棋系列2----兵棋游戏中地图滑动和委托消息
  20. TCP/IP之大明内阁

热门文章

  1. android 6.0点击效果,设置点击效果foreground
  2. 联网获取北京时间,而不是系统时间
  3. 深大2019计算机专业录取分数,深大2019年录取分数线超过一半以上双一流高校,“深大盒子2019探索版”神秘来袭...
  4. 牛客 小朋友做游戏详解<每日一题分享>
  5. Ubuntu编译Seetaface
  6. 西门子串口通讯10-CP441-2在STEP7环境中做Modbus从站通讯
  7. PCB快捷键的设置及推荐
  8. 别以为小公司的网络不需要设计,里头门道多着呢
  9. 分析zookeeper到底能做什么?
  10. 什么是 SAP ABAP? 类型、ABAP 完整形式和含义