用warshall算法求图的传递闭包矩阵

传递闭包

传递闭包的意思是说,如果顶点A能到达顶点B,并且顶点B能到达顶点C,那么顶点A一定能到达顶点C。

因此可以通过修改原始邻接矩阵得到传递闭包矩阵,使用的方法就是warshall方法。

原始邻接矩阵只表示哪些顶点是邻接顶点,而传递闭包矩阵表达的是每个顶点可以到达哪些顶点。


warshall算法的关键代码

//生成闭包矩阵
	public void getClosureMatrix(){
		for(int row=0;row<size;row++){
			for(int col=0;col<size;col++){
				if(adjMatrix[row][col] == 1){
					for(int z = 0;z < size;z++){
						if(adjMatrix[col][z] == 1){
							adjMatrix[row][z] =1;
						}
					}
				}	
			}
		}
		System.out.println("传递闭包矩阵为:");
		for(int a=0;a<size;a++){
			for(int b=0;b<size;b++){
				System.out.print(adjMatrix[a][b]+" ");
			}
			System.out.println();
		}
	}


完整代码

public class Warshall {
	
	public static void main(String[] args) {
		Graph g = new Graph(5);
		g.addVertex('A');
		g.addVertex('B');
		g.addVertex('C');
		g.addVertex('D');
		g.addVertex('E');
		g.addEdge(0, 1);
		g.addEdge(1, 3);
		g.addEdge(3, 4);
		g.addEdge(4, 2);
		g.addEdge(2, 3);
		g.showAdjMatrix();
		g.getClosureMatrix();
	}
	
}

class Vertex{
	private char elem;
	public Vertex(char elem){
		this.elem = elem;
	}
}
class Graph{
	private int size;
	private Vertex[] vertex; 
	private int[][] adjMatrix;
	private int count;
	//private Vertex newVertex;
	public Graph(int size){
		this.size = size;
		count = 0;
		vertex = new Vertex[size];
		adjMatrix = new int[size][size];
		for(int i=0;i<size;i++){
			for(int j=0;j<size;j++){
				adjMatrix[i][j] = 0;
			}
		}
	}
	//插入顶点
	public void addVertex(char elem){
		if(count<size){
		Vertex newVertex = new Vertex(elem);
		vertex[count++] = newVertex;
		}else{
			System.out.println("顶点数已满!");
		}
	}
	
	//设置边(因为是有向图,所以只需设置单向边)
	public void addEdge(int from,int to){
		adjMatrix[from][to] = 1;
	}
	
	//显示邻接矩阵
	public void showAdjMatrix(){
		for(int i=0;i<size;i++){
			for(int j=0;j<size;j++){
				System.out.print(adjMatrix[i][j]+" ");
			}
			System.out.println();
		}
	}
	
	//生成闭包矩阵
	public void getClosureMatrix(){
		for(int row=0;row<size;row++){
			for(int col=0;col<size;col++){
				if(adjMatrix[row][col] == 1){
					for(int z = 0;z < size;z++){
						if(adjMatrix[col][z] == 1){
							adjMatrix[row][z] =1;
						}
					}
				}	
			}
		}
		System.out.println("传递闭包矩阵为:");
		for(int a=0;a<size;a++){
			for(int b=0;b<size;b++){
				System.out.print(adjMatrix[a][b]+" ");
			}
			System.out.println();
		}
	}
}

运行结果


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值