📄 求解可达距阵.cpp
字号:
#include<stdio.h>
#define t 50
void main()
{
while(1)
{
int a[t][t],m[t][t],b[t][t];
int i,j,k,q,w;
int count=1,number;
char ch;
printf("请输入距阵的阶数:\n");
scanf("%d",&number);
printf("请输入邻接距阵:\n"); //输入邻接距阵
for(i=0;i<number;i++)
{
for(j=0;j<number;j++)
{
scanf("%d",&a[i][j]);
}
}
printf("*************************************\n");
printf("你输入的邻接距阵为:\n"); //显示邻接距阵
for(i=0;i<number;i++)
{
for(j=0;j<number;j++)
{
printf(" %d",a[i][j]);
}
printf("\n");
}
printf("*************************************\n");
printf("求得可达距阵为:\n"); //求解可达距阵
for(i=0;i<number;i++) //求A+I距阵
{
j=i;
if(a[i][j]==0)
{
a[i][j]=1;
}
}
for(i=0;i<number;i++)
{
for(j=0;j<number;j++)
{
b[i][j]=a[i][j];
}
}
while(1) //循环判断(A+I)的n次与n-1次是否相等,若相等退出循环
{
for(i=0;i<number;i++) //初始数组元数为零
{
for(j=0;j<number;j++)
{
m[i][j]=0;
}
}
for(i=0;i<number;i++) //计算两距阵相乘
{
for(k=0;k<number;k++)
{
for(j=0;j<number;j++)
{
m[i][k]=m[i][k]+a[i][j]*b[j][k];
if(m[i][k]>1) //数组元数大于1置为1
{
m[i][k]=1;
}
}
}
}
for(q=0;q<number;q++) //判段(A+I)的n-1次与(A+I)的n次是否相等
{
for(w=0;w<number;w++)
{
if(m[q][w]!=a[q][w])
{
break; //不相等跳出循环
}
}
if (w<number)
{
break;
}
}
if(q==number && w==number) //相等跳出while循环
{
break;
}
else
{
for(i=0;i<number;i++) //不相等把m赋给a继续while循环
{
for(j=0;j<number;j++)
{
a[i][j]=m[i][j];
}
}
count=count+1;
}
}
for(i=0;i<number;i++) //打印结果
{
for(j=0;j<number;j++)
{
printf(" %d",m[i][j]);
}
printf("\n");
}
printf("最大传递路长:%d\n",count);
printf("是否要继续(y/n)?");
scanf(" %c",&ch);
if (ch=='y' || ch=='Y')
{
count=1;
continue;
}
else if(ch=='n' || ch=='N')
{
break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -