傳遞閉包c語言
① C++編寫warshall演算法的傳遞閉包,1.利用求傳遞閉包的Warshall演算法,給定關系R,編寫求R的可傳遞閉包的c語言
最佳答案
#include <stdio.h>
#include <stdlib.h>
#define N 20
#define M 20
main()
{
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++如何編出關系的傳遞閉包,其中一段的程序我已給出,各位高手幫幫忙啊謝謝了,大神幫忙啊
#include<iostream> #include<memory> using namespace std; int main() { int r[101][101]; int a=0,b=0,c=0,n=0; cout<<"請輸入關系矩陣的階數"<<endl; cin>>n; for (a=1;a<=n;a++) { cout<<"請輸入矩陣的第"<<a<<"行,中間一空格隔開."<<endl; for (b=1;b<=n;b++) cin>>r[a][b]; } cout<<endl<<"原矩陣為"<<endl; for (a=1;a<=n;a++) { for (b=1;b<=n;b++) cout<<r[a][b]<<" "; cout<<endl; } //以上輸入矩陣完成 bool _finish=0; for(;;) { _finish=0; for(a=1;a<=n;a++) for(b=1;b<=n;b++) for(c=1;c<=n;c++) if ((r[a][b]==1)&&(r[b][c]==1)&&r[a][c]==0) { r[a][c]=1; _finish=1; } if (_finish ==0) break; } cout<<endl<<"t(r)的關系矩陣為"<<endl; for(a=1;a<=n;a++) { for(b=1;b<=n;b++) cout<<r[a][b]<<" "; cout<<endl; } return 0; }
③ 用C語言求一個關系矩陣的傳遞閉包
首先,矩陣的並運算不是很對,執行結果好象是第二條賦值語句,沒有實現並的概念;
然後,設計到返回數組首地址的函數中,嘗試一下把所有需要返回的數組定義為全局變數或者主函數中的參數變數,因為子函數執行完畢後,所申請的內存會被釋放,地址便無效;
再次,函數調用,傳遞數組的首地址才對,而不是數組某一個元素;
最後,子函數定義中,參數變數是二維數組,要寫上數組的維數,例如void tran(int a[6][6],int b[6][6]),不然會因為維數不確定而報錯.
④ 求計算機求解關系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)。
在實際演算法中,為了節約空間,可以直接在原來空間上進行迭代,這樣空間可降至二維。
代碼請見:
⑤ 用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"); }
⑥ 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演算法求傳遞閉包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語言編程求出它的自反閉包,對稱閉包和傳遞閉包
我用面向對象寫的 自己改一下
#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);
}
⑨ 用c語言編寫傳遞閉包時 A[j][k]=A[j][k]||A[i][k];為什麼這么寫
C語言不支持內嵌函數,沒有閉包。
⑩ 編程:求一個關系的傳遞閉包(C語言)
利用關系的矩陣表示,可以通過Warshall演算法計算有限集合上的二元關系的傳遞閉包。