java语言:编程求一个关系的闭包(自反,传递,对称)

离散数学:编程求一个关系的闭包

实现语言: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];

附上运行结果图在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/bhbhhyg/article/details/103232279