1. 程式人生 > >離散數學 Warshall演算法求傳遞閉包 C語言實現

離散數學 Warshall演算法求傳遞閉包 C語言實現

求傳遞閉包有一種有效演算法—Warshall演算法,這種演算法也便於計算機實現。 
(1)置新矩陣A=M; 
(2)i=1; 
(3)對所有j如果A[j,i]=1,則對k=1,2,…,n,A[j,k]=A[j,k]∨A[i,k](這裡的加是布林加); 
(4)i加1;(i是行,j是列) 
(5)如果i≤n,則轉到步驟3),否則停止。 

例如:一個的矩陣M:

 \begin{bmatrix} 1 & 1 & 0\\ 0 & 0 & 1\\ 0 & 1 & 0 \end{bmatrix}

第一步:當i=1時;找到M[j][i]==1時的位置;即M[1][1]=1;

再將第 j 行加上第 i 行得到新的第 j 行,即將第1行加上第1行得到新的第1行;有以下新矩陣,i+1:

\begin{bmatrix} 1 & 1 & 0\\ 0 & 0 & 1\\ 0 & 1 & 0 \end{bmatrix}

第二步:當i=2時;重複第一步的方法:有M[1][2]=1,M[3][2]=1;

再將第2行分別加到第1行和第3行上去得到新的第1、3行;有以下新矩陣,i+1:

\begin{bmatrix} 1 & 1 & 1\\ 0 & 0 & 1\\ 0 & 1 & 1 \end{bmatrix}

第三步:當i=3時;重複上述步驟:有M[1][3]=1,M[2][3]=1,M[3][3]=1;

再將第3行分別加到第1行,第2行,第3行上去;得到新矩陣,i+1:

\begin{bmatrix} 1 & 1 & 1\\ 0 & 1 & 1\\ 0 & 1 & 1 \end{bmatrix}  由於i+1=4>3(行數),停止,該矩陣為原矩陣的t(R)的關係矩陣;

程式碼:有每步過程

#include<bits/stdc++.h>
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
    bool matrix[100][100];
    int m,n;
    memset(matrix,0,sizeof(matrix));
    while(scanf("%d%d",&m,&n)!=EOF)
    {
        int i,j,k;
        for(i=1;i<=m;i++)
        {
            for(j=1;j<=n;j++)
            {
                scanf("%d",&matrix[i][j]);
            }
        }
        cout<<"..............."<<endl;
        
        for(i=1;i<=m;i++)
        {
            for(j=1;j<=n;j++)
            {
                if (matrix[j][i]==1)
                {
                    for (k=0;k<=n;k++)
                    {
                        matrix[j][k]+=matrix[i][k];
                        continue;
                    }
                }
            }
                for(int a=1;a<=m;a++)
                {
                    for(int b=1;b<=n;b++)
                    {
                        cout<<matrix[a][b]<<" ";
                    }
                cout<<"\n";
                }
            cout<<"........."<<"\n";
        }

        cout<<"結果為:"<<"\n";
        for(i=1;i<=m;i++)
        {
            for(j=1;j<=n;j++)
            {
                cout<<matrix[i][j]<<" ";
            }
            cout<<endl;
        }
    }
return 0;
}

相關推薦

離散數學 Warshall演算法傳遞 C語言實現

求傳遞閉包有一種有效演算法—Warshall演算法,這種演算法也便於計算機實現。  (1)置新矩陣A=M;  (2)i=1;  (3)對所有j如果A[j,i]=1,則對k=1,2,…,n,A[j,k]=A[j,k]∨A[i,k](這裡的加是布林加);  (4)i加1;(i

Gym 101873D - Pants On Fire - [warshall演算法傳遞]

題目連結:http://codeforces.com/gym/101873/problem/D   題意: 給出 $n$ 個事實,表述為 "XXX are worse than YYY"。再給出 $m$ 個某人說的話,也是表述為 "XXX are worse than YYY",對於每句話都要

Warshall演算法傳遞

#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const i

Warshall(沃舍爾)演算法傳遞

1.離散數學定義: t(R) = R u R^2 u R^3 u..... 其中R^(n+1) = R^n 複合 R 矩陣表示: M(R) = M + M^2 + M^3 +....+M^n(其中加為邏輯加) 所以我們只要按照這個公式每次更新M,最後的Mn就是傳遞閉包

離散數學之關係(傳遞

傳遞閉包的定義:R’是R(不具有傳遞性質)變動最少的步驟得到的具有傳遞性質的關係。方法:warshall法即執行n次,每次使得MR[n][i],MR[i][n]都為1時使得MR[i][j]為1,否則還是為MR[i][j].#include<stdio.h> #de

WARSHALL演算法計算傳遞

    考慮n+1個矩陣的序列M0,M1,……,Mn,將矩陣Mk的第i行記作Mk[i,j].    對於k=0,1,……,n,Mk[i,j]=1當且僅當在R的關係圖中存在一條從xi到xj路徑,並且這條路徑除了端點外中間只經過{x1,x2,……,xk}中的結點。WARSHALL

離散題目18 傳遞 warshell演算法

Problem Description 給出一個集合A和A上的關係R,求關係R的傳遞閉包。 例如: A={0,1,2} , R={<0,0>,<1,0>,<2,2>,<1,2>,<2,1>}

離散數學中關係的自反、對稱、傳遞C++程式碼

#include<iostream>#include<cstdio>#include<cstring>using namespace std;class Relation{ int p[20][20];public: Relation() 

poj 1932 XYZZY(spfa最長路+判斷正環+floyd傳遞

XYZZY Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 4154   Accepted: 1185

集合,聚點,區別離散數學中的關係R

聚點是拓撲空間的基本概念之一。設A為拓撲空間X的子集,a∈X,若a的任意鄰域都含有異於a的A中的點,則稱a是A的聚點。集合A的所有聚點的集合稱為A的導集,聚點和導集等概念是康托爾(Cantor,G.(F.P.))研究歐幾里得空間的子集時首先提出的。 閉包   閉包運算時關係上的一元運算。

HDU 6152 Friend-Graph(2017CCPC網路選拔賽)【Floyed傳遞

【中文題意】就是一個好的隊伍符合以下條件:不會有三個人互相認識或三個人互相不認識。 【思路分析】題目時間給的很足,直接用floyed跑完傳遞閉包然後暴力搞一下就行了。 【AC程式碼】 #i

POJ 3660 Cow Contest(Floyd傳遞(可達矩陣))

Cow Contest Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 16341 Accepted: 9146 Description N (1 ≤ N ≤ 100) c

迪傑斯特拉演算法最短路徑 C++程式碼實現

#include<iostream> #include<string> using namespace std; /*鄰接矩陣的型別定義*/ #define MAX 10000000 #define MAX_VERTEX_NUM 20 typedef

分組密碼演算法AES-128,192,256 C語言實現第一版

AES的C語言實現入門版  AES分組密碼演算法中明文分組位128bits,金鑰分組可以為128,192,256bits。AES也是由最基本的變換單位——“輪”多次迭代而成的。我們將 AES 中的輪變換計為 Round(State, RoundKey),State 表示訊息矩陣;Roun

演算法】希爾排序C語言實現

上一篇文章我們一起學習了直接插入排序,它的原理就是把前i個長度的序列變成有序序列,然後迴圈迭代,直至整個序列都變為有序的.但是說來說去它還是一個時間複雜度為(n^2)的演算法,難道就不能再進一步把時間複雜度降低一階麼?可能有很多同學說快速排序,堆排序,我都會,這些簡單的插

PAT Basic 1054. 平均值 (20)(C語言實現

, CSDN內容暫時不更新(將來有計劃更新), 請前往連結檢視最新內容. 歡迎star 我的repo題目本題的基本要求非常簡單:給定N個實數,計算它們的平均值。但複雜的是有些輸入資料

資料結構排序演算法之歸併排序(c語言實現

博主身為大二萌新,第一次學習資料結構,自學到排序的時候,對於書上各種各樣的排序演算法頓覺眼花繚亂,便花了很長的時間盡力把每一個演算法都看懂,但限於水平有限,可能還是理解較淺,於是便將它們逐個地整理實現出來,以便加深理解。 歸併排序就是通過將一個具有n個key記錄的線性表,看

演算法之並查集 C語言實現3

標頭檔案 UnionFind3.h #ifndef UNIONFIND3_H_INCLUDED #define UNIONFIND3_H_INCLUDED #include "stdlib.h" #include "ASSERT.h" typedef stru

演算法訓練 反置數 C語言實現

演算法訓練 反置數 題目: 問題描述   一個整數的“反置數”指的是把該整數的每一位數字的順序顛倒過來所得到的另一個整數。如果一個整數的末尾是以0結尾,那麼在它的反置數當中,這些0就被省略掉了。比如

演算法訓練 阿爾法乘積 C語言實現

問題描述   計算一個整數的阿爾法乘積。對於一個整數x來說,它的阿爾法乘積是這樣來計算的:如果x是一個個位數,那麼它的阿爾法乘積就是它本身;否則的話,x的阿爾法乘積就等於它的各位非0的數字相乘所得到的那個整數的阿爾法乘積。例如:4018224312的阿爾法乘積等於8,它是按照以下的步驟來計算的:   4018