#include <stdio.h>
void main(){
int adjmat[4][4] = {
{0,1,0,0},
{0,0,1,1},
{1,1,0,1},
{1,0,0,0}
};
printf("原始矩阵:\n");
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
printf("%d\t",adjmat[i][j]);
}
printf("\n");
}
int n = 4;
for(int k=0;k<n;k++){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(adjmat[i][j]&&adjmat[i][k]||adjmat[k][j])
adjmat[i][j] = 1;
}
}
}
printf("闭包矩阵:\n");
for(int m=0;m<4;m++){
for(int n=0;n<4;n++){
printf("%d\t",adjmat[m][n]);
}
printf("\n");
}
}
public class WarShall
{
public static void main(String args[]){
int[][] AdjMat = {
{0,1,0,0},
{0,0,1,1},
{1,1,0,1},
{1,0,0,0}
};
System.out.println("原始矩阵:\n");
for(int i=0;i<AdjMat.length;i++){
for(int j=0;j<AdjMat.length;j++){
System.out.print(AdjMat[i][j] + " ");
}
System.out.println();
}
int[][] BiBao = WarShall(AdjMat);
System.out.println("输出表达传递闭包的矩阵:\n");
for(int i=0;i<BiBao.length;i++){
for(int j=0;j<BiBao.length;j++){
System.out.print(BiBao[i][j] + " ");
}
System.out.println();
}
}
public static int[][] WarShall(int[][] AdjMat){
//传递一个图的邻接矩阵为参数,返回表达它的传递闭包的矩阵
int [][] Rresult = AdjMat; //初始化结果R0
int n = AdjMat.length;
for(int k=0;k<n;k++){//由R0到Rn,做n步变换
int[][] Rtemp = new int[n][n];//每循环一下,求下次结果
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(Rresult[i][j] == 1)
Rtemp[i][j] = 1;
else if(Rresult[i][k] == 1 & Rresult[k][j] == 1)
Rtemp[i][j] =1;
else
Rtemp[i][j] = 0;
}
}
Rresult = Rtemp;
}
return Rresult;
}
}