在这个程序中,我没有使用数据结构中的思想,而是使用了最简单的二维数组来实现Warshall算法。
代码如下:
#include<stdio.h>
main(){
int i,j;//i为列数,j为行数
//定义矩阵大小
printf("请输入行列的数量:");
scanf("%d",&i);
j = i;
int a[i][j];
int j1,i1;
//矩阵的输入
for(j1 = 0;j1 < j;j1++){
printf("请输入第%d行的数字:\n",j1+1);
for(i1 = 0;i1 < i;i1++){
scanf("%d",&a[i1][j1]);
}
}
//初始矩阵的输出
printf("您输入的矩阵为\n");
for(j1 = 0;j1 < j;j1++){
for(i1 = 0;i1 < i;i1++){
printf("%d\t",a[i1][j1]);
}
printf("\n");
}
//i2为正在查找的列
int i2,j2;
//这个循环决定整个算法的运算次数
for(i2 = 0;i2 < i;i2++){
int b[i];//b存放哪些行应该被修改
int n;//n用来初始化b[i]
//这个循环用来对每一列进行判断
for(n = 0;n<i;n++){
b[n]=0;
}
for(j2 = 0;j2 < j;j2++){
if(a[i2][j2]==1){
b[j2] = 1;
}
}
int j3 = 0;//i3是正在变化的行
for(;j3<j;j3++) {
//如果两行是同一行,跳过
if(j3==i2)
continue;
if(b[j3]==1){//找到了这一行
int y;//y为俩行作比较时被修改的行所查找到的数位
for(y=0;y<i;y++) {
if(a[y][j3]!=a[y][i2]){
a[y][j3]+=a[y][i2];
}
else
continue;
}
}
}
}
printf("输出结果为\n");
for(j1 = 0;j1 < j;j1++){
for(i1 = 0;i1 < i;i1++){
printf("%d\t",a[i1][j1]);
}
printf("\n");
}
}
运算结果: