初始化:
public Graph(List<Vertex> vertexs, int[][] edges) {
this.vertexs = vertexs;
this.topVertexs=new ArrayList<GRAPGAPI.Vertex>();
this.edges = edges;
this.minTree=new int[this.vertexs.size()][this.vertexs.size()];
initUnVisited();
}
首先得初始化图,获得定点代码
public List<Vertex> getNeighbors(Vertex v) {
//参数检测
if(!isInGraph(v)){
System.out.println("当前节点不在图中");
return null;
}
List<Vertex> neighbors = new ArrayList<Vertex>();
int position = vertexs.indexOf(v);
Vertex neighbor = null;
int distance;
for (int i = 0; i < vertexs.size(); i++) {
if (i == position) {
//顶点本身,跳过
continue;
}
distance = edges[position][i]; //到所有顶点的距离
if (distance < Integer.MAX_VALUE) {
//是邻居(有路径可达)
neighbor = getVertex(i);
if (!neighbor.isMarked()) {
//如果邻居没有访问过,则加入list;
neighbors.add(neighbor);
}
}
}
return neighbors;
}
//深度优先
public void DFS(String vertexName){
int id=getIdOfVertexName(vertexName);
if(id==-1)return;
vertexs.get(id).setMarked(true);
System.out.println("遍历到"+vertexs.get(id).getName());
List<Vertex> neighbors = getNeighbors(vertexs.get(id));
for(int i=0;i<neighbors.size();i++){
if(!neighbors.get(i).isMarked()){
DFS(neighbors.get(i).getName());
}
}
}
//广度优先
public void BFS(String vertexName){
int startID=getIdOfVertexName(vertexName);
if(startID==-1) return;
List<Vertex> q=new ArrayList<Vertex>();
q.add(vertexs.get(startID));
vertexs.get(startID).setMarked(true);
while(!q.isEmpty()){
Vertex curVertex=q.get(0);
q.remove(0);
System.out.println("遍历到"+curVertex.getName());
List<Vertex> neighbors = getNeighbors(curVertex);
for(int i=0;i<neighbors.size();i++){
if(!neighbors.get(i).isMarked()){
neighbors.get(i).setMarked(true);
q.add(neighbors.get(i));
}
}
}
}
public void topSort(){
int[][] tmpEdges=edges;
int IDofNullPreVertex=getNullPreVertexID(tmpEdges);//获得当前图中无前驱的节点
while(IDofNullPreVertex!=-1){
vertexs.get(IDofNullPreVertex).setMarked(true);
topVertexs.add(vertexs.get(IDofNullPreVertex));//拓扑序列增加
//边销毁
for(int j=0;j<this.vertexs.size();j++){
if(tmpEdges[IDofNullPreVertex][j]!=Integer.MAX_VALUE){
tmpEdges[IDofNullPreVertex][j]=Integer.MAX_VALUE;
}
}
IDofNullPreVertex=getNullPreVertexID(tmpEdges);
}
}
public int[][] getMinTree(){
initMinTree();//初始化最小生成树
while(!allVisited()){
Vertex vertex = vertexs.get(getNotMarkedMinVertex());//设置处理节点
System.out.println("处理:节点"+vertex.getName());
//顶点已经计算出最短路径,设置为"已访问"
vertex.setMarked(true);
//获取所有"未访问"的邻居
List<Vertex> neighbors = getNeighbors(vertex);
System.out.println("邻居个数为:"+neighbors.size());
//更新最小生成树
updateMinEdge(vertex, neighbors);
}
System.out.println("search over");
setMinTree();
return minTree;
}
根据图的变化可以进行最小生成树的更新
public void updateMinEdge(Vertex vertex, List<Vertex> neighbors){
//参数检测
if(!isInGraph(vertex)){
System.out.println("当前节点不在图中");
return ;
}
for(Vertex neighbor: neighbors){
int distance = edges[getIdOfVertexName(neighbor.getName())][getIdOfVertexName(vertex.getName())];
if(neighbor.getAnotherIDinminEdge()==-1){
neighbor.setAnotherIDinminEdge(getIdOfVertexName(vertex.getName()));
System.out.println(neighbor.getName()+" setEdge To"+vertex.getName()+edges[neighbor.getAnotherIDinminEdge()][getIdOfVertexName(neighbor.getName())]);
}
else if(distance < edges[getIdOfVertexName(neighbor.getName())][neighbor.getAnotherIDinminEdge()]){
neighbor.setAnotherIDinminEdge(getIdOfVertexName(vertex.getName()));
System.out.println(neighbor.getName()+" setEdge To"+vertex.getName()+edges[neighbor.getAnotherIDinminEdge()][getIdOfVertexName(neighbor.getName())]);
}
}
}
首先进行寻找定点的最短路径
public void search(){
while(!unVisited.isEmpty()){
Vertex vertex = unVisited.element();
//顶点已经计算出最短路径,设置为"已访问"
vertex.setMarked(true);
List<Vertex> neighbors = getNeighbors(vertex);
//更新邻居的最短路径
updatesDistance(vertex, neighbors);
pop();
}
System.out.println("最短路径");
}
然后根据邻居最短路径的更新,进行的输出
public List<Vertex> getNeighbors(Vertex v) {
//参数检测
if(!isInGraph(v)){
System.out.println("当前节点不在图中");
return null;
}
List<Vertex> neighbors = new ArrayList<Vertex>();
int position = vertexs.indexOf(v);
Vertex neighbor = null;
int distance;
for (int i = 0; i < vertexs.size(); i++) {
if (i == position) {
//顶点本身,跳过
continue;
}
distance = edges[position][i]; //到所有顶点的距离
if (distance < Integer.MAX_VALUE) {
//是邻居(有路径可达)
neighbor = getVertex(i);
if (!neighbor.isMarked()) {
//如果邻居没有访问过,则加入list;
neighbors.add(neighbor);
}
}
}
return neighbors;
}
问题2:在进行输入图时,进行对节点的最短路径的处理,返现我卡在了第一个节点。
问题2解决方法:邻接矩阵的输入方式存在敕位问题。
在进行运算生成图的时候,选择链表进行图的生成时,后续的排序会比较麻烦,而且在进行图的顶点的各种操作时(读取),顶点的入度出度会显示。关键在进行各种排序时,还是,还有需要报错程序,这样找不到顶点可以自动返回。
原文:https://www.cnblogs.com/lyz182329/p/11994388.html