传递闭包
传递闭包的意思是说,如果顶点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();
}
}
}
运行结果