图论算法-求(有向)图中任意两点间所有路径
2016-08-30 13:44
387 查看
1建图:
图类中包括如下信息:顶点集合,邻接矩阵。
节点类中包括如下信息:是否被访问过,节点的名称,从这个节点访问到下一个节点的集合
2 算法思路
A 将始点设置为已访问,将其入栈
B 查看栈顶节点V在图中,有没有可以到达、且没有入栈、且没有从这个节点V出发访问过的节点
C 如果有,则将找到的这个节点入栈
D 如果没有,则将节点V访问到下一个节点的集合中每个元素赋值为零,V出栈
E 当栈顶元素为终点时,设置终点没有被访问过,打印栈中元素,弹出栈顶节点
F 重复执行B – E,直到栈中元素为空
源码下载:http://download.csdn.net/detail/ha000/9616787
图类中包括如下信息:顶点集合,邻接矩阵。
节点类中包括如下信息:是否被访问过,节点的名称,从这个节点访问到下一个节点的集合
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(); } } }
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); } }
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(); } }
源码下载:http://download.csdn.net/detail/ha000/9616787
相关文章推荐
- 图论算法-求(有向)图中任意两点间所有路径
- acm题目及我的程序(2)——Knight Moves (骑士跳跃) ——任意两点间的最短路径所有信息(算法1)
- acm题目及我的程序(2)——Knight Moves (骑士跳跃) ——任意两点间的最短路径所有信息(算法2)
- 求两点间所有路径的遍历算法
- 求无向图中任意两点的所有路径
- C++计算图任意两点间的所有路径
- 图的邻接链表实现下的搜索两点之间所有路径的算法
- 设计并实现求两点间所有路径的算法
- 图论02——任意两点间最短距离及路径
- 求两点之间所有路径的算法
- 任意两点间最短路径算法实现
- Dijkstra [迪杰斯特拉]算法思路(求单点到其他每个点的各个最短路径)Floyd算法:任意两点间最短距离
- 无向连通图中两点间所有路径的算法
- 图两点间的最短路径,所有路径算法C语言实现
- 图的邻接链表实现下的搜索两点之间所有路径的算法
- 【算法】单源最短路径和任意两点最短路径总结(补增:SPFA)
- 图论04——任意指定点到所有其它点的最短路径及距离
- 任意两点间最短路径算法实现
- poj1125 Stockbroker Grapevine 图论,任意两点间最短路径,floyd
- 图两点间的最短路径,所有路径算法C语言实现