离散数学:编程求一个关系的闭包
实现语言:java
package 离散数学;
import java.util.Scanner;
public class Work5 {
public static void main(String[] args) {
System.out.println("请输入集合A以空格隔开");
Scanner in = new Scanner(System.in);
String a = in.nextLine();
int j = 0;
String a1= a.replaceAll(" ","");
char []A=new char [a1.length()];
for(int i=0;i<a1.length();i++)
{
A[j]=a1.charAt(i);
j++;
}
System.out.println("请输入关系R以空格隔开");
String a2 = in.nextLine();
String a22= a2.replaceAll("
","");
char []R=new char [a22.length()];
j=0;
for(int i=0;i<a22.length();i++)
{
R[j]=a22.charAt(i);
j++;
}
int j1=0;
int [] R1 =new int[R.length];
for(int i =0;i<a22.length();i++)
for(j=0;j<a1.length();j++)
{
if(R[i]==A[j])
{
R1[j1]=j;
j1++;
}
}
int N = a1.length();
int [][]r = new int [a1.length()][a1.length()];
for(int i=0;i<a1.length();i++)
for( j=0;j<a1.length();j++)
{
r[i][j]=0;
}
for(int i=0;i<=R.length-2;i+=2)
r[R1[i]][R1[i+1]]=1;
System.out.println("关系为");
for(int i=0;i<a1.length();i++)
for( j=0;j<a1.length();j++)
{
System.out.print(r[i][j]+"\t");
if(j==a1.length()-1)
{
System.out.println();
}
}
int [][] c=new int[a1.length()][a1.length()];
Work5 work =new Work5();
//初始化c=r求自反闭包
work.initc(c, r,N);
int zfdx=0;
for(int i=0;i<N;i++)
for(j=0;j<N;j++)
if(i==j) c[j][i]=1;
for(int i=0;i<N;i++)
for(j=0;j<N;j++)
if(c[i][j]==1)
zfdx++;
int [] zifan = new int[zfdx*2];
j1=0;
for(int i=0;i<N;i++)
for(j=0;j<N;j++)
if(c[i][j]==1)
{
zifan[j1]=i;
j1++;
zifan[j1]=j;
j1++;
}
System.out.println();
System.out.println("自反闭包为");
for(j=0;j<=zfdx*2-2;j+=2)
{
System.out.print(A[zifan[j]]);
System.out.print(A[zifan[j+1]]+"
");
}
System.out.println();
for(int i=0;i<N;i++)
for( j=0;j<N;j++)
{
System.out.print(c[i][j]+"\t");
if(j==a1.length()-1)
{
System.out.println();
}
}
//求对称闭包
work.initc(c, r,N);
for(int i=0;i<N;i++)
for(j=0;j<N;j++)
if(c[i][j]==1)
c[j][i]=1;
int dc=0;
for(int i=0;i<N;i++)
for(j=0;j<N;j++)
if(c[i][j]==1)
dc++;
int [] duichen = new int[dc*2];
j1=0;
for(int i=0;i<N;i++)
for(j=0;j<N;j++)
if(c[i][j]==1)
{
duichen[j1]=i;
j1++;
duichen[j1]=j;
j1++;
}
System.out.println("对称闭包为");
for(j=0;j<=dc*2-2;j+=2)
{
System.out.print(A[duichen[j]]);
System.out.print(A[duichen[j+1]]+"
");
}
System.out.println();
for(int i=0;i<N;i++)
for( j=0;j<N;j++)
{
System.out.print(c[i][j]+"\t");
if(j==a1.length()-1)
{
System.out.println();
}
}
//求传递闭包
work.initc(c, r,N);
for(int i=0;i<N;i++)
for(j=0;j<N;j++)
{
if(c[j][i]==1)
for(int k=0;k<N;k++)
{
c[j][k]=c[j][k]+c[i][k];
if(c[j][k]>1) c[j][k]=1;
}
}
int cd=0;
for(int i=0;i<N;i++)
for(j=0;j<N;j++)
if(c[i][j]==1)
cd++;
int [] chuandi = new int[cd*2];
j1=0;
for(int i=0;i<N;i++)
for(j=0;j<N;j++)
if(c[i][j]==1)
{
chuandi[j1]=i;
j1++;
chuandi[j1]=j;
j1++;
}
System.out.println("传递闭包为");
for(j=0;j<=cd*2-2;j+=2)
{
System.out.print(A[chuandi[j]]);
System.out.print(A[chuandi[j+1]]+"
");
}
System.out.println();
for(int i=0;i<N;i++)
for( j=0;j<N;j++)
{
System.out.print(c[i][j]+"\t");
if(j==a1.length()-1)
{
System.out.println();
}
}
}
void initc(int [][] c,int [][] r,int s) {
for(int i=0;i<s;i++)
for(int j=0;j<s;j++)
c[i][j]=r[i][j];
附上运行结果图