warshall算法



//求传递闭包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;
}
//注释:两种方法同样的效果,一个用到了矩阵相乘的形式,一个直接利用了算法。


 

你可能感兴趣的:(算法)