java 图的深度优先和广度优先搜索以及关键路径.doc

上传人:11****ws 文档编号:2991104 上传时间:2019-05-16 格式:DOC 页数:10 大小:73.50KB
下载 相关 举报
java 图的深度优先和广度优先搜索以及关键路径.doc_第1页
第1页 / 共10页
java 图的深度优先和广度优先搜索以及关键路径.doc_第2页
第2页 / 共10页
java 图的深度优先和广度优先搜索以及关键路径.doc_第3页
第3页 / 共10页
java 图的深度优先和广度优先搜索以及关键路径.doc_第4页
第4页 / 共10页
java 图的深度优先和广度优先搜索以及关键路径.doc_第5页
第5页 / 共10页
点击查看更多>>
资源描述

1、package 数据结构.图的邻接表法;/*思路(这是一个无向图):* 1、从命令行接收增加节点数把它放在一个一维数组中* 2、增加边数,同时找这个边是否在图中,若在,就构造邻接表*/import java.util.ArrayList;import java.util.Scanner;import java.util.Stack;class ArcNode / 表结点int info; / 该弧相关信息的指针int adjvex; / 邻接点域ArcNode next; / 指向下一条弧的指针public ArcNode(int adjvex, int info) / 构造函数this.ad

2、jvex = adjvex;this.info = info;this.next = null;class VNode / 头结点int data; / 顶点信息(如数据等)ArcNode firstarc; / 指向第一条依附该顶点的边的弧指针public VNode(int data) / 构造函数this.data = data;this.firstarc = null;class ALGraph ArrayList vertces = new ArrayList(); / 存放图顶点信息的数组int vexnum;/ 图的当前顶点数int arcnum;/ 图的弧数public ALG

3、raph() / 构造函数this.arcnum = 0;this.vexnum = 0;public class ALGraphMain ALGraph g = new ALGraph();LinkQueue q = new LinkQueue(); / 广度优先搜索栈LinkStack linkStack = new LinkStack(); / 拓扑排序顶点栈LinkStack linkStackT = new LinkStack(); / T 为拓扑序列顶点栈LinkStack linkStackS = new LinkStack(); / S 为零入度顶点栈ArrayList vis

4、itedDFS = new ArrayList(); / 深度优先访问标志数组ArrayList visitedBFS = new ArrayList(); / 广度优先访问标志数组ArrayList indegree = new ArrayList(); / 存放顶点入度的数组ArrayList indegreeCritical = new ArrayList(); / 存放关键路径的顶点入度的数组ArrayList early = new ArrayList(); / 顶点最早开始时间数组ArrayList last = new ArrayList(); / 顶点最晚开始时间数组void

5、add_vex() / 增加节点数System.out.println(“输入无向图的顶点数“);Scanner scanner = new Scanner(System.in);g.vexnum = scanner.nextInt();System.out.println(“输入顶点信息:“);for (int i = 0; i = g.vexnum)return -1;return i;void CreatUDN() add_vex(); / 增加顶点数add_arc(); / 增加边数/* 思路:先输出当前顶点,如果下一条邻接顶点不为空,则输出 */void printAdjList()

6、 / 输出邻接表int i;ArcNode p;System.out.println(“编号t 顶点t 邻点编号“);for (i = 0; i = 0; w = NextAdjvex(this.g.vertces.get(v).data, this.g.vertces.get(w).data) if (this.visitedDFS.get(w) = false) DFS(w);/* 基本实现思想 (1)顶点 v 入队列。 (2)当队列非空时则继续执行,否则算法结束。 (3)出队列取得队头顶点 v;访问顶点 v 并标记顶点 v 已被访问。* (4)查找顶点 v 的第一个邻接顶点 w。 (5)

7、若 v 的邻接顶点 w 未被访问过的,则 w 入队列。* (6)继续查找顶点 v 的另一个新的邻接顶点 w,转到步骤( 5) 。 直到顶点 v 的所有未被访问过的邻接点处理完。转到步骤(2) 。* 广度优先遍历图是以顶点 v 为起始点,由近至远,依次访问和 v 有路径相通而且路径长度为 1,2,的顶点。* 为了使“先被访问顶点的邻接点”先于“后被访问顶点的邻接点”被访问,需设置队列存储访问的顶点。* * 伪代码 (1)初始化队列 Q;visitedn=0; (2)访问顶点 v;visitedv=1 ;顶点v 入队列 Q; (3)* while(队列 Q 非空) v=队列 Q 的对头元素出队;

8、w=顶点 v 的第一个邻接点; while(w 存在) 如果 w 未访问,则访问顶点 w;* visitedw=1; 顶点 w 入队列 Q; w=顶点 v 的下一个邻接点。*/private void BFS() / 广度优先搜索int u;for (int i = 0; i = 0; w = NextAdjvex(this.g.vertces.get(u).data,this.g.vertces.get(w).data)if (this.visitedBFS.get(w) = false) / 如果 w 顶点未被访问,则w 顶点入队列this.visitedBFS.set(w, true);

9、System.out.print(g.vertces.get(w).data + “ “);q.EnQueue(w); / w 顶点入队列private void FindInDegree() / 输出入度数for (int i = 0; i this.early.get(k) / 求最早发生时间this.early.set(k, this.early.get(j) + p.info);if (count g.vexnum) / 如果入栈顶点数小于图的顶点数,则图中有环路return false; else return true;private void CriticalPath() / 关

10、键路径ArcNode p;int k;int ee; / 每条弧的最早开始时间int el; / 每条弧的最晚开始时间if (!TopologicalOrder() System.out.println(“图中有环路“);for (int i = 0; i g.vexnum; i+) /初始化最晚开始时间this.last.add(this.early.get(g.vexnum - 1);System.out.print(“输出最早开始时间:“);for (int i = 0; i g.vexnum; i+) System.out.print(early.get(i) + “ “);Syste

11、m.out.println();while (!linkStackT.IsEmpty() / 出栈求最晚开始时间int j = linkStackT.Pop();for (p = g.vertces.get(j).firstarc; p != null; p = p.next) k = p.adjvex;if (last.get(k) - p.info last.get(j) / 活动最晚开始时间last.set(j, last.get(k) - p.info); / for/ whileSystem.out.print(“输出最晚开始时间:“);for (int i = 0; i g.vex

12、num; i+) System.out.print(last.get(i) + “ “);System.out.println();for (int i = 0; i g.vexnum; i+) / 求 ee 和 el 以及关键路径for (p = g.vertces.get(i).firstarc; p != null; p = p.next) k = p.adjvex;ee = early.get(i);el = last.get(k) - p.info;if (ee = el) / 若某条弧满足条件 ee=el,则为关键活动。System.out.println(g.vertces.ge

13、t(i).data + “到“+ g.vertces.get(k).data + “长度为:“ + p.info+ “ 发生时间为:“ + ee);/ forpublic static void main(String args) ALGraphMain agp = new ALGraphMain();agp.CreatUDN();agp.printAdjList();System.out.print(“图的深度优先遍历为:“);agp.DFSTraverse();System.out.println();System.out.print(“图的广度优先遍历为:“);agp.BFS();System.out.println();System.out.print(“各顶点入度为:“);agp.FindInDegree();System.out.println();System.out.print(“图的拓扑排序为:“);agp.TopologicalSort();System.out.println();System.out.println(“图的关键路径为:“);agp.CriticalPath();System.out.println();

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 实用文档资料库 > 策划方案

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。