當前位置:首頁 » 編程語言 » 用c語言求傳遞閉包
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

用c語言求傳遞閉包

發布時間: 2022-10-11 09:45:27

⑴ 用c語言求一個關系矩陣的傳遞閉包

首先,矩陣的並運算不是很對,執行結果好象是第二條賦值語句,沒有實現並的概念;
然後,設計到返回數組首地址的函數中,嘗試一下把所有需要返回的數組定義為全局變數或者主函數中的參數變數,因為子函數執行完畢後,所申請的內存會被釋放,地址便無效;
再次,函數調用,傳遞數組的首地址才對,而不是數組某一個元素;
最後,子函數定義中,參數變數是二維數組,要寫上數組的維數,例如void tran(int a[6][6],int b[6][6]),不然會因為維數不確定而報錯.

⑵ 用c語言編寫傳遞閉包時 A[j][k]=A[j][k]||A[i][k];為什麼這么寫

C語言不支持內嵌函數,沒有閉包。

⑶ 求計算機求解關系R的傳遞閉包 C語言演算法

傳遞閉包,最簡單的技術是採用 【弗洛伊德演算法】

Floyd-Warshall演算法(Floyd-Warshall algorithm)是解決任意兩點間的最短路徑的一種演算法,可以正確處理有向圖或負權的最短路徑問題,同時也被用於計算有向圖的傳遞閉包。

Floyd-Warshall演算法的時間復雜度為O(N3),空間復雜度為O(N2)。

Floyd-Warshall演算法的原理是動態規劃。

設Di,j,k為從i到j的只以(1..k)集合中的節點為中間節點的最短路徑的長度。

1.若最短路徑經過點k,則Di,j,k = Di,k,k − 1 + Dk,j,k − 1;
2.若最短路徑不經過點k,則Di,j,k = Di,j,k − 1。
因此,Di,j,k = min(Di,k,k − 1 + Dk,j,k − 1,Di,j,k − 1)。
在實際演算法中,為了節約空間,可以直接在原來空間上進行迭代,這樣空間可降至二維。

代碼請見:

⑷ 離散數學中傳遞閉包怎麼求 通俗一點

方法:warshall法,即運行n次,每次使得MR[n][i],MR[i][n]都為1時使得MR[i][j]為1,否則還是為MR[i][j]。
傳遞閉包的計算過程一般可以用Warshell演算法描述:
For 每個節點i Do
For 每個節點j Do
If j能到i Then
For 每個節點k Do
a[j, k] := a[j, k] Or ( a[j, i] And a[ i, k] )
其中a數組為布爾數組,用來描述兩個節點是否相連,可以看做一個無權圖的鄰接矩陣。演算法過程跟Floyd很相似,三重循環,枚舉每個中間節點。不過傳遞閉包只需要求出兩個節點是否相連,而不用求其間的最短路徑長。
傳遞性:對於一個節點i,如果j能到i,i能到k,那麼j就能到k。求傳遞閉包,就是把圖中所有滿足這樣傳遞性的節點都弄出來,計算完成後,就知道任意兩個節點之間是否相連。
傳遞閉包的定義:R』是R(不具有傳遞性質)變動最少的步驟得到的具有傳遞性質的關系。
(4)用c語言求傳遞閉包擴展閱讀
演算法實例:
#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;
}
運行結果:
參考資料:網路-傳遞閉包

⑸ 用c語言編 一個關系的傳遞閉包

說明:以關系矩陣形式計算傳遞閉包: #include"stdio.h" #define N 1000 main() { int i,j,a[N][N],b[N][N],c[N][N],s=0,k,e[N][N],m,n; printf("請輸入你的關系矩陣的階n(n<=1000):\n"); scanf("%d",&n); printf("請輸入你的關系矩陣:\n"); for(i=0;i<n;i++) for(j=0;j<n;j++) { scanf("%d",&a[i][j]); e[i][j]=a[i][j]; b[i][j]=a[i][j]; } for(m=1;m<n;m++) { for(i=0;i<n;i++) for(j=0;j<n;j++) { for(s=0,k=0;k<n;k++) s+=b[i][k]*a[k][j]; c[i][j]=s; if(e[i][j]==0&&c[i][j]!=0) e[i][j]=c[i][j]; } for(i=0;i<n;i++) for(j=0;j<n;j++) b[i][j]=c[i][j]; } for(i=0;i<n;i++) for(j=0;j<n;j++) if(e[i][j]!=0) printf("<%d,%d>,",i+1,j+1); printf("\n"); }

⑹ 離散數學中傳遞閉包怎麼求 通俗一點

方法:warshall法,即運行n次,每次使得MR[n][i],MR[i][n]都為1時使得MR[i][j]為1,否則還是為MR[i][j]。
傳遞閉包的計算過程一般可以用Warshell演算法描述: 
For 每個節點i Do
For 每個節點j Do
If j能到i Then
For 每個節點k Do
a[j, k] := a[j, k] Or ( a[j, i] And a[ i, k] ) 
其中a數組為布爾數組,用來描述兩個節點是否相連,可以看做一個無權圖的鄰接矩陣。演算法過程跟Floyd很相似,三重循環,枚舉每個中間節點。不過傳遞閉包只需要求出兩個節點是否相連,而不用求其間的最短路徑長。
傳遞性:對於一個節點i,如果j能到i,i能到k,那麼j就能到k。求傳遞閉包,就是把圖中所有滿足這樣傳遞性的節點都弄出來,計算完成後,就知道任意兩個節點之間是否相連。 
傳遞閉包的定義:R』是R(不具有傳遞性質)變動最少的步驟得到的具有傳遞性質的關系。
(6)用c語言求傳遞閉包擴展閱讀
演算法實例:
#include
#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;
}
運行結果:
參考資料:網路-傳遞閉包

⑺ (離散數學)輸入一個關系矩陣,用C語言編程求出它的自反閉包,對稱閉包和傳遞閉包

我用面向對象寫的 自己改一下

#include<iostream.h>
template<class T>
void Warshall( T *a , int m , int n )
{
int i = 0,j = 0;
for( i = 0 ; i < n ; i++ )
{
for( j = 0 ; j < m ; j++ )
{
if( a[j][i] == 1 )
{
int k = 0;
for( int x = 0 ; x < n ; x++ )
{
a[j][k] = a[j][k] || a[i][k];
k++;
}
}
}

}
for( i = 0 ; i < m ; i++ )
{
for( j = 0 ; j < n ; j++ )
{
cout << a[i][j] << '\t';
}
cout<<endl;
}
}
void main()
{
int ai[4][4] = { {0,1,0,0} , {1,0,1,0} , {0,0,0,1} , {0,0,0,0} };
Warshall(ai,4,4);
}

⑻ 1.利用求傳遞閉包的Warshall演算法,給定關系R,編寫求R的可傳遞閉包的C語言程序並利用下列數據測試。

c++版
#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>

void main()
{
int n_dim=0;
cout<<"Input number of dimensions:";
cin>>n_dim;

char **array=new char*[n_dim]; //以下是動態創建一個 n_dim*n_dim 數組,如不太清楚的看我BLOG里的
char ch; //另一篇關於動態數組的文章

for(int i=0;i<n_dim;i++)
{
array[i]=new char[n_dim]; //這句也是
for(int j=0;j<n_dim;j++)
{
cin>>ch;
array[i][j]=ch;
}
}

for(i=0;i<n_dim;i++)
for(int j=0;j<n_dim;j++)
for(int k=0;k<n_dim;k++)
if(array[i][j]=='1'&&array[k][i]=='1')
array[k][j]='1';
cout<<"The trasitive closure of a relation R represented:"<<endl;
for(i=0;i<n_dim;i++)
{
for(int j=0;j<n_dim;j++)
cout<<array[i][j];
cout<<endl;
}

}

另一c++
#include <iostream>
#include <string>
using namespace std;
int **matrix;
void warshall(int n,int **m);
void setValue(int elem1,int elem2,int value);
void buildMatrix(int numElement);
int main()
{
int num;
string str;
cout << "Please input the number of elements:" << endl;
cin >> num;
buildMatrix(num);
cout << "Please input a set,such as R={(x1,x2),(x3,x4),...}: " << endl;
cin >> str;
for(int i=0;i<str.size();i++)
if((str.at(i)=='(') && (str.at(i+2)==','))
setValue(str.at(i+1)-'0',str.at(i+3)-'0',1);

warshall(num,matrix);
return 0;
}

void warshall(int n,int **m)
{
int i,j,k;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(m[j][i] == 1)
for(k=0;k<n;k++)
m[j][k] = m[j][k] || m[i][k];
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
cout << " " << m[i][j] << " ";
cout << endl;
}
}

void setValue(int elem1,int elem2,int value)
{
if(value>0)
matrix[elem1-1][elem2-1] = value;
}

void buildMatrix(int numElement)
{
int i,j;
matrix = (int**) new int*[numElement];

for(i=0;i<numElement;i++)
matrix[i] = new int[numElement];
for(j=0;j<numElement;j++)
for(i=0;i<numElement;i++)
matrix[j][i] = 0;
}

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

#include <stdio.h>#include <stdlib.h>#define N 20#define M 20main(){ int i,j,k,m,n; int r1[M],r2[M],a[N],mr[N][N]={0}; FILE * fp; printf("程序自動調用c:/stone2.txt文件內相應數據\n"); fp=fopen("c:\\stone2.txt","r"); fscanf(fp,"%d",&n); /*讀取集合元素個數*/ for(i=0;i<n;i++) /*讀取集合元素*/ fscanf(fp,"%d",&a[i]); fscanf(fp,"%d",&m); /*讀取關系個數*/ for(k=0;k<m;k++) fscanf(fp,"%d,%d",&r1[k],&r2[k]); /*讀取關系*/ fclose(fp); printf("自反閉包r(R):\n{"); for(i=0;i<n;i++) printf("<%d,%d>,",a[i],a[i]); /*輸出自反閉包*/ for(k=0;k<m;k++) { if(r1[k]!=r2[k]) printf("<%d,%d>,",r1[k],r2[k]); else continue; } printf("\b}\n"); printf("對稱閉包s(R):\n{"); /*輸出對稱閉包*/ for(k=0;k<m;k++) { if(r1[k]!=r2[k]) printf("<%d,%d>,<%d,%d>,",r1[k],r2[k],r2[k],r1[k]); else printf("<%d,%d>,",r1[k],r2[k]); } printf("\b}\n"); k=0; for(i=0;i<n,k<m;i++) { if(r1[k]!=a[i]) continue; else { for(j=0;j<n,k<m;j++) /*關系轉換成矩陣*/ { if(r2[k]!=a[j]) continue; else { mr[i][j]=1; k++; i=0;j=0; break; } } } } printf("關系所對應的關系矩陣:\n"); for(i=0;i<n;i++) { /*列印關系矩陣*/ for(j=0;j<n;j++) printf("%5d",mr[i][j]); printf("\n"); } for(k=0;k<n;k++) for(i=0;i<n;i++) /*warshall*/ for(j=0;j<n;j++) mr[i][j]+=mr[i][j]+mr[i][k]*mr[k][j]; for(i=0;i<n;i++) for(j=0;j<n;j++) { /*把mr[]非0項賦值為1*/ if(!mr[i][j]) continue; else mr[i][j]=1; } printf("傳遞閉包對應關系矩陣:\n"); for(i=0;i<n;i++) { /*輸出傳遞閉包對應的關系矩陣*/ for(j=0;j<n;j++) printf("%5d",mr[i][j]); printf("\n"); } system("PAUSE");}自己寫的,三個閉包都有,包括傳遞閉包,看注釋就知道了,還是用文件讀寫,方便數據輸入

⑽ 編程:求一個關系的傳遞閉包(C語言)

利用關系的矩陣表示,可以通過Warshall演算法計算有限集合上的二元關系的傳遞閉包。