码迷,mamicode.com
首页 > 编程语言 > 详细

Warshall算法求传递闭包

时间:2019-05-18 20:35:29      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:end   hal   int   efi   实现   turn   i++   margin   mamicode   

传递闭包

在数学中,在集合 X 上的二元关系 R 的传递闭包是包含 R 的 X 上的最小的传递关系。

例如,如果 X 是(生或死)人的集合而 R 是关系“为父子”,则 R 的传递闭包是关系“x 是 y 的祖先”。再比如,如果 X 是空港的集合而关系 xRy 为“从空港 x 到空港 y 有直航”,则 R 的传递闭包是“可能经一次或多次航行从 x 飞到 y”。

Warshall算法

Warshall在1962年提出了一个求关系的传递闭包的有效算法。其具体过程如下,设在n个元素的有限集上关系R的关系矩阵为M:
(1)置新矩阵A=M;
(2)置k=1;
(3)对所有i如果A[i,k]=1,则对j=1..n执行:
A[i,j]←A[i,j]∨A[k,j];
(4)k增1;
(5)如果k≤n,则转到步骤(3),否则停止。
所得的矩阵A即为关系R的传递闭包t(R)的关系矩阵。
 
代码实现:
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 typedef unsigned long long ull;
 5 #define INF 0x3f3f3f3f
 6 const ll MAXN = 1e3 + 7;
 7 const ll MAXM = 1e4 + 7;
 8 const ll MOD = 1e9 + 7;
 9 const double pi = acos(-1);
10 int Mat[20][20]; //
11 void Print_Mat(int n)
12 {
13     for (int i = 0; i < n; i++)
14     {
15         for (int j = 0; j < n; j++)
16             cout << Mat[i][j] << " ";
17         cout << endl;
18     }
19     return;
20 }
21 void Warshall(int n)
22 {
23     for (int k = 0; k < n; k++)
24         for (int i = 0; i < n; i++)
25             for (int j = 0; j < n; j++)
26                 if (Mat[i][k] && Mat[k][j])
27                     Mat[i][j] = 1;
28 }
29 int main()
30 {
31     int n;
32     cout << "输入矩阵阶数" << endl;
33     while (cin >> n)
34     {
35         memset(Mat, 0, sizeof(Mat));
36         cout << "输入矩阵M:" << endl;
37         for (int i = 0; i < n; i++)
38             for (int j = 0; j < n; j++)
39                 cin >> Mat[i][j];
40         for (int i = 0; i < n-1; i++)
41             Warshall(n);
42         cout << "矩阵M的传递闭包为:" << endl;
43         Print_Mat(n);
44         cout << "输入矩阵阶数" << endl;
45     }
46     return 0;
47 }

 

 技术图片

 

 

 

 

Warshall算法求传递闭包

标签:end   hal   int   efi   实现   turn   i++   margin   mamicode   

原文地址:https://www.cnblogs.com/graytido/p/10886732.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!