1. 程式人生 > >離散數學之關係(傳遞閉包)

離散數學之關係(傳遞閉包)

傳遞閉包的定義:

R’是R(不具有傳遞性質)變動最少的步驟得到的具有傳遞性質的關係。

方法:warshall法


即執行n次,每次使得MR[n][i],MR[i][n]都為1時使得MR[i][j]為1,否則還是為MR[i][j].

#include<stdio.h>
#define  N 10 
int judge(int k,int i,int j)
{
	if(i==1 && j==1){
		return 1;
	}
	return k;
}
void warShall(int MR[N][N],int n)
{
	for(int k=0;k<n;k++){
		for(int i=0;i<n;i++){
			for(int j=0;j<n;j++){
				if(i!=k || j!=k){
					MR[i][j]=judge(MR[i][j],MR[k][j],MR[i][k]);
				}
			}
		}
	}
	
} 
int main()
{
	int MR[10][10];
	int mul;
	scanf("%d",&mul);
	for(int i=0;i<mul;i++){
		for(int j=0;j<mul;j++){
			scanf("%d",&MR[i][j]);
		}
	}
	printf("求傳遞閉包為:\n");
	warShall(MR,mul);
	for(int i=0;i<mul;i++){
		for(int j=0;j<mul;j++){
			printf("%d ",MR[i][j]);
		}
		printf("\n");
	}
	return 0;
}

執行結果: