求(有向)图中任意两点间所有路径
1建图:
图类中包括如下信息:顶点集合,邻接矩阵。
节点类中包括如下信息:是否被访问过,节点的名称,从这个节点访问到下一个节点的集合
<!--[endif]-->
图1
<!--[endif]-->
图2
2 算法思路
A 将始点设置为已访问,将其入栈
B 查看栈顶节点V在图中,有没有可以到达、且没有入栈、且没有从这个节点V出发访问过的节点
C 如果有,则将找到的这个节点入栈
D 如果没有,则将节点V访问到下一个节点的集合中每个元素赋值为零,V出栈
E 当栈顶元素为终点时,设置终点没有被访问过,打印栈中元素,弹出栈顶节点
F 重复执行B – E,直到栈中元素为空
package util;
public class Graph {
private Vertex vertexList[]; // list of vertices
private int adjMat[][]; // adjacency matrix
private int nVerts;
private static int MAX_VERTS = 7; // n个点
int i = 0;
int j = 0;
public Vertex[] getVertexList() {
return vertexList;
}
public int[][] getAdjMat() {
return adjMat;
}
public int getN() {
return MAX_VERTS;
}
public Graph(int index) {
adjMat = new int[MAX_VERTS][MAX_VERTS]; // 邻接矩阵
vertexList = new Vertex[MAX_VERTS]; // 顶点数组
nVerts = 0;
for (i = 0; i < MAX_VERTS; i++) {
for (j = 0; j < MAX_VERTS; j++) {
adjMat[i][j] = 0;
}
}
addVertex('A');
addVertex('B');
addVertex('C');
addVertex('D');
addVertex('E');
addVertex('F');
addVertex('G');
addEdge(0, 1);
addEdge(0, 2);
addEdge(1, 4);
addEdge(2, 0);
addEdge(2, 5);
addEdge(3, 0);
addEdge(3, 2);
addEdge(3, 3);
addEdge(4, 1);
addEdge(4, 2);
addEdge(5, 6);
addEdge(6, 3);
switch (index) {
case 0:
break;
case 1:
delEdge(4, 2);
break;
default:
break;
}
}
private void delEdge(int start, int end) {
adjMat[start][end] = 0;
}
private void addEdge(int start, int end) {// 有向图,添加边
adjMat[start][end] = 1;
// adjMat[end][start] = 1;
}
public void addVertex(char lab) {
vertexList[nVerts++] = new Vertex(lab);// 添加点
}
public char displayVertex(int i) {
return vertexList[i].getLabel();
}
public boolean displayVertexVisited(int i) {
return vertexList[i].WasVisited();
}
public void printGraph() {
for (i = 0; i < MAX_VERTS; i++) {
System.out.print("第" + displayVertex(i) + "个节点:" + " ");
for (j = 0; j < MAX_VERTS; j++) {
System.out.print(displayVertex(i) + "-" + displayVertex(j)
+ ":" + adjMat[i][j] + " ");
}
System.out.println();
}
}
}
package util;
import java.util.ArrayList;
public class Vertex {
boolean wasVisited; // 是否遍历过
public char label; // 节点名称
ArrayList<Integer> allVisitedList;// 节点已访问过的顶点
public void setAllVisitedList(ArrayList<Integer> allVisitedList) {
this.allVisitedList = allVisitedList;
}
public ArrayList<Integer> getAllVisitedList() {
return allVisitedList;
}
public boolean WasVisited() {
return wasVisited;
}
public void setWasVisited(boolean wasVisited) {
this.wasVisited = wasVisited;
}
public char getLabel() {
return label;
}
public void setLabel(char label) {
this.label = label;
}
public Vertex(char lab) // constructor
{
label = lab;
wasVisited = false;
}
public void setVisited(int j) {
allVisitedList.set(j, 1);
}
}
package util;
import java.util.ArrayList;
import java.util.Stack;
public class AF {
boolean isAF = true;
Graph graph;
int n;
int start, end;
Stack<Integer> theStack;
private ArrayList<Integer> tempList;
private String counterexample;
public AF(Graph graph, int start, int end) {
this.graph = graph;
this.start = start;
this.end = end;
}
public boolean getResult() {
graph.printGraph();
n = graph.getN();
theStack = new Stack<Integer>();
if (!isConnectable(start, end)) {
isAF = false;
counterexample = "节点之间没有通路";
} else {
for (int j = 0; j < n; j++) {
tempList = new ArrayList<Integer>();
for (int i = 0; i < n; i++) {
tempList.add(0);
}
graph.getVertexList()[j].setAllVisitedList(tempList);
}
isAF = af(start, end);
}
return isAF;
}
private boolean af(int start, int end) {
graph.getVertexList()[start].setWasVisited(true); // mark it
theStack.push(start); // push it
while (!theStack.isEmpty()) {
int v = getAdjUnvisitedVertex(theStack.peek());
if (v == -1) // if no such vertex,
{
tempList = new ArrayList<Integer>();
for (int j = 0; j < n; j++) {
tempList.add(0);
}
graph.getVertexList()[theStack.peek()]
.setAllVisitedList(tempList);// 把栈顶节点访问过的节点链表清空
theStack.pop();
} else // if it exists,
{
theStack.push(v); // push it
}
if (!theStack.isEmpty() && end == theStack.peek()) {
graph.getVertexList()[end].setWasVisited(false); // mark it
printTheStack(theStack);
System.out.println();
theStack.pop();
}
}
return isAF;
}
// 判断连个节点是否能连通
private boolean isConnectable(int start, int end) {
ArrayList<Integer> queue = new ArrayList<Integer>();
ArrayList<Integer> visited = new ArrayList<Integer>();
queue.add(start);
while (!queue.isEmpty()) {
for (int j = 0; j < n; j++) {
if (graph.getAdjMat()[start][j] == 1 && !visited.contains(j)) {
queue.add(j);
}
}
if (queue.contains(end)) {
return true;
} else {
visited.add(queue.get(0));
queue.remove(0);
if (!queue.isEmpty()) {
start = queue.get(0);
}
}
}
return false;
}
public String counterexample() {
for (Integer integer : theStack) {
counterexample += graph.displayVertex(integer);
if (integer != theStack.peek()) {
counterexample += "-->";
}
}
return counterexample;
}
// 与节点v相邻,并且这个节点没有被访问到,并且这个节点不在栈中
public int getAdjUnvisitedVertex(int v) {
ArrayList<Integer> arrayList = graph.getVertexList()[v]
.getAllVisitedList();
for (int j = 0; j < n; j++) {
if (graph.getAdjMat()[v][j] == 1 && arrayList.get(j) == 0
&& !theStack.contains(j)) {
graph.getVertexList()[v].setVisited(j);
return j;
}
}
return -1;
} // end getAdjUnvisitedVertex()
public void printTheStack(Stack<Integer> theStack2) {
for (Integer integer : theStack2) {
System.out.print(graph.displayVertex(integer));
if (integer != theStack2.peek()) {
System.out.print("-->");
}
}
}
}
import util.AF;
import util.Graph;
public class Main {
public static void main(String[] args) {
//第几张图,有两张(0,1),起点序号(0-6),终点序号(0-6)
AF operation = new AF(new Graph(0), 3, 6);
operation.getResult();
}
}
- 大小: 12.4 KB
- 大小: 12.9 KB
分享到:
相关推荐
图论算法-求(有向)图中任意两点间所有路径
算法中将一条线视为一个结点,采用广度优先搜索,利用树结构存储搜索结果,算法效率高,在武汉地铁11条线路190余个站点的线网图中测试,任意两点间的所有路径平均耗时0.2秒。只要对算法中的费用矩阵做调整,即可适用...
总之,遍历图中两点之间所有路径的算法是图论中的核心问题,通过深度优先搜索可以有效地解决。它在多种实际场景中都有应用,如网络路由、社交网络分析、游戏设计等。掌握这样的算法能够提升你在处理复杂网络问题时的...
通过运行这个算法,程序将能够计算出无向图中任意两点间的最短路径。 在压缩包文件"TTSP"中,可能包含了实现迪杰斯特拉算法的代码或者数据结构,用于演示或练习如何在实际问题中应用该算法。用户可以通过理解这些...
本项目“求图中任意两点的最短路径和全部路径应用”是基于C++编程语言,并利用Microsoft Foundation Classes (MFC)库进行开发的。下面将详细介绍这个项目涉及的关键知识点。 1. 图论基础:图是由顶点(节点)和边...
本资源主要介绍了采用邻接表存储有向图的方式来判断任意两个顶点间是否存在路径的算法。该算法通过在邻接表中遍历顶点之间的弧来确定两点间是否存在路径。 知识点一:邻接表的定义 邻接表是图论中的一种数据结构,...
在IT领域,计算任意两点之间的最短路径是一个经典问题,主要涉及到图论和算法设计。在计算机科学中,图是一种抽象的数据结构,用于表示对象之间的关系。每条边表示两个对象之间的连接,而节点则代表单个对象。计算两...
在IT领域,图论算法是计算机科学中的一个重要分支,它主要研究如何在图结构中寻找最优路径、最小生成树等问题。本次将详细解析一个特定的图论算法——最小生成树算法,具体而言,我们将深入探讨一种名为Prim算法的...
暴强Dijkstra算法求任意两点间最短路径(matlab程序) 本文主要介绍了使用Dijkstra算法求任意两点间最短路径的matlab程序。Dijkstra算法是图论中常用的寻找最短路径的算法,通过对其实现可以有效地解决许多实际问题。...
1. 提出了一种求解图中任意两点间所有最短路径的算法。该算法从终点出发,递归地减少相邻节点的出度,并计算当前最短路径长度,存储有效的直接后继节点。当所有出度为0的节点都处理完毕时,可以得到源点到终点的所有...
1. **最短路径算法**:Dijkstra算法和Floyd-Warshall算法是最常用的求解图中两点间最短路径的方法。Dijkstra算法适用于单源最短路径问题,而Floyd-Warshall可以解决所有顶点对间的最短路径。 2. **最小生成树算法**...
根据给定的文件信息,本篇文章将详细解析如何在已知的有向图中找到从顶点u到顶点v的所有简单路径,并基于提供的代码片段进行深入分析。 ### 一、问题背景 在计算机科学中,图论是研究顶点(节点)与边(连接这些...
这个算法的主要目标是找到图中所有顶点对之间的最短路径,不仅适用于有向图,也适用于无向图。在C语言中实现这个算法,可以为各种应用提供基础,比如在导游系统中计算两点之间的最短路线。 以下是弗罗伊德算法的...
连通性(Connectivity)是指图中任意两个顶点是否都能通过一系列边相连;环(Cycle)是在图中形成的一条首尾相连的边序列。 3. 图的表示:图可以使用邻接矩阵(Adjacency Matrix)或邻接表(Adjacency List)来存储...
- **弗洛伊德算法(Floyd's Algorithm)**:解决任意两点间最短路径问题的算法。 **2.4 可行遍性问题** - **连通性问题**: 确定图是否连通,即图中是否存在路径使得任意两个顶点都可以互相到达。 - **割点(Cut ...
Dijkstra算法是一种经典的图论算法,用于寻找有向或无向加权图中单源最短路径。在本例中,我们使用它来解决全国城市之间的最短路径问题。首先,我们需要建立一个数据结构来存储全国城市之间的交通网络,这通常可以...
在IT领域,尤其是在图论和算法设计中,解决“两点间最短路径”问题是非常重要的。...通过构建图模型并利用Floyd算法,可以高效地找到任意两点间最短的收费路径,为交通管理和路线规划提供有效支持。
"含障碍的两点最短路径算法"是一种解决特定空间规划问题的方法,它适用于那些包含静态障碍物的环境,比如寻路问题或者游戏中的角色移动路径规划。在标题和描述中提到的,这个算法并不涉及图论中的节点或经典最短路径...
图论中求任意两点间的最短距离matlab程序实现