计算传递闭包

//沃舍尔算法计算传递闭包
//warshall:
//W=M
//for k=1 to n
//begin
//  for i=1 to n
//  begin
//    for j=1 to n
//    W(ij)=W(ij)+(W(ik)*W(kj))
//  end
//end
//
//
#include <iostream>
using namespace std;
int v,edge;
int** draw();//绘图
void transitive(int **a);//计算


int main(int argc, char const *argv[])
{
	int** a=draw();
	transitive(a);

	delete []a;
	return 0;
}

int** draw()//绘图  
{  
  int i,j;  
  cin>>v>>edge;///输入点数目和边数目 

  int **a=new int*[v];
  for ( i = 0; i < v; ++i)  
    a[i]=new int[v];  

  for ( i = 0; i < v; ++i)  
    for ( j = 0; j < v; ++j)  
      a[i][j]=0;  
  
  int spot1,spot2;  
  for ( i = 0; i < edge; ++i)  
  {  
    cin>>spot1>>spot2;  
    a[spot1][spot2]=1;
  }  
///-------------------------------------------------------------///  
    	cout<<"\n";
    for ( i = 0; i < v; ++i)
    {  
	    for ( j = 0; j < v; ++j)
	    {
	      cout<<a[i][j]<<" "; 
	      } 
    cout<<"\n";  
    }  
    cout<<"\n";  
  return a;  
}  
void transitive(int **a)//计算
{
	int i,j,k;
    for ( k = 0; k < v; ++k)
    {
    	for (i = 0; i < v; ++i)
    	{
    		for ( j = 0; j < v; ++j)
    		{
    			if (a[i][j] || (a[i][k] && a[k][j]))
    			{
    				a[i][j]=1;
    			}
    		}
    	}
    }
    for ( i = 0; i < v; ++i)
    { cout<<"\n";
    	for ( j = 0; j < v; ++j)
    	{
    		cout<<a[i][j];
    	}
    }
}

3 5
0 0
0 2
1 1
2 0
2 1
1 0 1
0 1 0
1 1 0


111
010
111Press any key to continue

//计算传递闭包
//R*=R1+R2+R3+....+Rn
//Rn=Rn-1+R1
//使用矩阵表示
//算法:
//A=M
//B=A
//for(2 to n)
//  begin
//    A=A*M
//    B=B+A
//  end
#include <iostream>
using namespace std;
int v,edge;
int** draw();//绘图
void transitive(int **a);//计算


int main(int argc, char const *argv[])
{
	int** a=draw();
	transitive(a);

	delete []a;
	return 0;
}

int** draw()//绘图  
{  
  int i,j;  
  cin>>v>>edge;///输入点数目和边数目 

  int **a=new int*[v];
  for ( i = 0; i < v; ++i)  
    a[i]=new int[v];  

  for ( i = 0; i < v; ++i)  
    for ( j = 0; j < v; ++j)  
      a[i][j]=0;  
  
  int spot1,spot2;  
  for ( i = 0; i < edge; ++i)  
  {  
    cin>>spot1>>spot2;  
    a[spot1][spot2]=1;
  }  
///-------------------------------------------------------------///  
    	cout<<"\n";
    for ( i = 0; i < v; ++i)
    {  
	    for ( j = 0; j < v; ++j)
	    {
	      cout<<a[i][j]<<" "; 
	      } 
    cout<<"\n";  
    }  
    cout<<"\n";  
  return a;  
}  
void transitive(int **a)//计算
{
	int i,j,k,h;
 int **at=new int*[v];
  for ( i = 0; i < v; ++i)  
    at[i]=new int[v];  
 int **bb=new int*[v];
  for ( i = 0; i < v; ++i)  
    bb[i]=new int[v];  

  for ( i = 0; i < v; ++i)  
    for ( j = 0; j < v; ++j)  
      bb[i][j]=at[i][j]=a[i][j]; 

  for ( i = 0; i < v-1; ++i)
  {
  	for ( j = 0; j < v; ++j)
  		for ( k = 0; k < v; ++k)  	
  			for ( h = 0; h < v; ++h) 			
  				if (at[j][h]*a[h][k] == 1)at[j][k]=1;
		if (at[j][h] && a[h][k])at[j][k]=1;
    for ( k = 0; k < v; ++k)
    	for ( h = 0; h < v; ++h)
			if (bb[k][h]+at[k][h] >=1)//if (bb[k][h] || at[k][h])
    			bb[k][h]=1;   
  }
      for ( k = 0; k <v; ++k){
      	cout<<"\n";
    	for ( h = 0; h < v; ++h)
    			cout<<bb[k][h];   
    	}
}

3 5
0 0
0 2
1 1
2 0
2 1
1 0 1
0 1 0
1 1 0


111
010
111Press any key to continue




  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

紫云的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值