//求传递闭包R+的warshall算法
#include<iostream>
#include<malloc.h>
#define N 7
/*using namespace std;
int main(){
int i,j,k;
int R[N][N]={
{1, 1, 0, 0, 0, 0, 0},
{0, 0, 0, 1, 0, 0, 0},
{0, 0, 0, 0, 1, 0, 0},
{0, 1, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0}};
for(k=0;k<N;k++)
for(i=0;i<N;i++)
for(j=0;j<N;j++){
R[i][j]+= R[i][k]*R[k][j];
if(R[i][j]!=0)
R[i][j]=1;
}
for(i=0;i<N;i++)
for(j=0;j<N;j++){
cout<<R[i][j]<<" ";
if(j==6) cout<<endl;
}
} */
//理解算法思想是关键,认清不宜改变的变量i.
#include<stdio.h>
int main(){
int i,j,k;
int a[7][7]={
{1, 1, 0, 0, 0, 0, 0},
{0, 0, 0, 1, 0, 0, 0},
{0, 0, 0, 0, 1, 0, 0},
{0, 1, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0} };
for(i=0; i<7; i++)
for(j=0; j<7; j++)
if(a[j][i] == 1)
for(k=0; k<7; k++)
a[j][k] = a[j][k] || a[i][k];
for(i=0; i<7; i++)
for(j=0; j<7; j++){
printf("%d ",a[i][j]);
if(j == 6) printf("\n");
}
return 0;
}
//注释:两种方法同样的效果,一个用到了矩阵相乘的形式,一个直接利用了算法。