离散数学求通路数和回路数的2种实现

请前辈学长学姐同学们批评指正!

这个是题目:

有向图D如图所示,求:……

下面这个是网上的解答:

 

下面是第一种方法的运行结果:

 

第一种实现方法代码:(这种方法是直接找,使用了多重循环和判断,代码又臭又长,但是思想还是比较简单的,哈哈哈,然后女朋友说他们班有人写的更好,所以看了下,然后又从网上看了下上面这个图,我感觉第二种方法比较好,所以也自己实现了下。)

#include <stdio.h>
int main(int argc, const char * argv[])
{
    // 有向图 D的矩阵
    int a[6][6] ={
      0,0,0,0,0,0,
      0,0,0,0,0,1,  //  1->5
      0,1,0,1,0,0,  //  2->1,2->3
      0,0,0,0,0,1,  //  3->5
      0,1,0,1,0,0,  //  4->1,4->3
      0,0,1,0,1,0   //  5->1,5->4
    };
    
    //(1). V2到V5长度为1,2,3,4的通路数
    int len1[5] = {0};
    int i1=2;
    printf("(1)\n");
    while(i1)
    {
        for(int k1=1;k1<=5;k1++)
        {
            if(a[i1][k1]==1)
            {
                if(k1==5)
                    len1[1]++;  //长度为 1
                else
                {
                    for(int k2=1;k2<=5;k2++)
                    {
                        if(a[k1][k2]==1)
                        {
                            if(k2==5)
                                len1[2]++;  //长度为 2
                            for(int k3=1;k3<=5;k3++)
                            {
                                if(a[k2][k3]==1)
                                {
                                    if(k3==5)
                                        len1[3]++;   //长度为 3
                                    else
                                    {
                                        for(int k4=1;k4<=5;k4++)
                                        {
                                            if(a[k3][k4]==1)
                                            {
                                                if(k4==5)
                                                    len1[4]++;   //长度为 4
                                                else
                                                    len1[0]++;
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        
        for(int t=1;t<5;t++)
            printf("V2->V5 长度为 %d 的通路有 %d 个\n",t,len1[t]);
        
        i1=0;
    }
    
    
    //(2). V5到V5长度为1,2,3,4的回路数
    int i2=5;
    int len2[5]={0};
    printf("(2)\n");
    while(i2)
    {
        for(int j1=1;j1<=5;j1++)
        {
            if(a[i2][j1]==1)
            {
                if(j1==i2)
                    len2[1]++;  //长度为 1 的回路数+1
                else{
                    for(int j2=1;j2<=5;j2++)
                    {
                        if(a[j1][j2]==1)
                        {
                            if(j2==i2)
                                len2[2]++;  //长度为 2 的回路数
                            else{
                                for(int j3=1;j3<=5;j3++)
                                {
                                    if(a[j2][j3]==1)
                                    {
                                        if(j3==i2)
                                            len2[3]++;  //长度为 3 的回路数
                                        else{
                                            for(int j4=1;j4<=5;j4++)
                                            {
                                                if(a[j3][j4]==1)
                                                {
                                                    if(j4==i2)
                                                        len2[4]++;  //长度为 4 的回路数
                                                    else
                                                        len2[0]++;
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        i2=0;
        for(int t=1;t<5;t++)
            printf("V5->V5 长度为 %d 的回路有 %d 个\n",t,len2[t]);
    }
    
    //(3)D中长度为4的通路数(含回路数)
    printf("(3)\n");
    int len_4=0;
    for(int i3=1;i3<=5;i3++)
    {
        for(int j1=1;j1<=5;j1++)
        {
            if(a[i3][j1]==1)
            {
                for(int j2=1;j2<=5;j2++)
                {
                    if(a[j1][j2]==1)
                    {
                        for(int j3=1;j3<=5;j3++)
                        {
                            if(a[j2][j3]==1)
                            {
                                for(int j4=1;j4<=5;j4++)
                                {
                                    if(a[j3][j4]==1)
                                    {
                                        len_4++;
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    
    printf("D中长度=4的通路数(含回路数)有 %d 个\n",len_4);
    
    
    // (4) D中长度<=4的回路数
    printf("(4)\n");
    int len4[5]={0};
    for(int i4=1;i4<=5;i4++)
    {
        for(int j1=1;j1<=5;j1++)
        {
            if(a[i4][j1]==1)
            {
                if(i4==j1)
                    len4[1]++;
                else{
                    for(int j2=1;j2<=5;j2++)
                    {
                        if(a[j1][j2]==1)
                        {
                            if(j2==i4)
                                len4[2]++;
                            else{
                                for(int j3=1;j3<=5;j3++)
                                {
                                    if(a[j2][j3]==1)
                                    {
                                        if(j3==i4)
                                            len4[3]++;
                                        else{
                                            for(int j4=1;j4<=5;j4++)
                                            {
                                                if(a[j3][j4]==1)
                                                {
                                                    if(j4==i4)
                                                        len4[4]++;
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        
        
        
        
    }
    
    
    len4[0]=len4[1]+len4[2]+len4[3]+len4[4];
    printf("D中长度<=4的回路数有 %d 个\n",len4[0]);
    
    //(5)写出D的可达矩阵
    int a1[6][6] ={
        0,0,0,0,0,0,
        0,0,0,0,0,1,  //  1->5
        0,1,0,1,0,0,  //  2->1,2->3
        0,0,0,0,0,1,  //  3->5
        0,1,0,1,0,0,  //  4->1,4->3
        0,0,1,0,1,0   //  5->1,5->4
    };
    printf("(5)\n");
    
    for(int t=1;t<=5;t++)
    {
        a1[t][t]=1;
    }
    for(int i5=1;i5<=5;i5++)
    {
        for(int j1=1;j1<=5;j1++)
        {
            if(a[i5][j1]==1)
                a1[i5][j1]=1;
            else{
                for(int j2=1;j2<=5;j2++)
                {
                    if(a[j1][j2]==1)
                        a1[i5][j2]=1;
                    else{
                        for(int j3=1;j3<=5;j3++)
                        {
                            if(a[j2][j3]==1)
                                a1[i5][j3]=1;
                            else{
                                for(int j4=1;j4<=5;j4++)
                                {
                                    if(a[j3][j4]==1)
                                        a1[i5][j4]=1;
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    printf("D的可达矩阵:\n");
    for(int t1=1;t1<=5;t1++)
    {
        for(int t2=1;t2<=5;t2++)
        {
            printf("%d ",a1[t1][t2]);
        }
        printf("\n");
    }
    
    return 0;
}

 

 

 

下面是第二种方法的运行结果:

 

下面是第二种实现方法的代码:

//
//  main.c
//  离散实验3 第二种解法
//
//  Created by hanoi_ahoj on 2018/6/21.
//  Copyright © 2018年 hanoi_ahoj. All rights reserved.
//


#include <stdio.h>


int main(int argc, const char * argv[]) {
    
    int a[6][6]={
        0,0,0,0,0,0,
        0,0,0,0,0,1,
        0,1,0,1,0,0,
        0,0,0,0,0,1,
        0,1,0,1,0,0,
        0,0,1,0,1,0
    };
    int aa[6][6]={0};   //A^2 = A * A
    int aaa[6][6]={0};  //A^3 = A^2 * A
    int aaaa[6][6]={0}; //A^4 = A^3 * A
    
    // aa
    for(int i=1;i<6;i++)
    {
        for(int j=1;j<6;j++)
        {
            //aa[i][j] = a[i][k]*a[k][j]
            for(int k=1;k<6;k++)
            {
                aa[i][j]+=a[i][k]*a[k][j];
            }
        }
    }
    // aaa
    for(int i=1;i<6;i++)
    {
        for(int j=1;j<6;j++)
        {
            //aaa[i][j] = aa[i][k]*a[k][j]
            for(int k=1;k<6;k++)
            {
                aaa[i][j]+=aa[i][k]*a[k][j];
            }
        }
    }
    // aaaa
    for(int i=1;i<6;i++)
    {
        for(int j=1;j<6;j++)
        {
            // aaaa[i][j] = aaa[i][k] * a[k][j]
            for(int k=1;k<6;k++)
            {
                aaaa[i][j]+=aaa[i][k]*a[k][j];
            }
        }
    }
    /*
    printf("A^2:\n");
    for(int i=1;i<6;i++)
    {
        for(int j=1;j<6;j++)
        {
            printf("%d ",aa[i][j]);
        }
        printf("\n");
    }
    printf("A^3:\n");
    for(int i=1;i<6;i++)
    {
        for(int j=1;j<6;j++)
        {
            printf("%d ",aaa[i][j]);
        }
        printf("\n");
    }
    printf("A^4:\n");
    for(int i=1;i<6;i++)
    {
        for(int j=1;j<6;j++)
        {
            printf("%d ",aaaa[i][j]);
        }
        printf("\n");
    }*/
    
    //(1).
    printf("(1).V2->V5长度为1,2,3,4的通路数有%d,%d,%d,%d个\n",a[2][5],aa[2][5],aaa[2][5],aaaa[2][5]);
    //(2).
    printf("V5->V5长度为1,2,3,4的通路数有%d,%d,%d,%d个\n",a[5][5],aa[5][5],aaa[5][5],aaaa[5][5]);
    //(3).
    int cnt3=0;
    for(int i=1;i<6;i++)
    {
        for(int j=1;j<6;j++)
        {
            cnt3+=aaaa[i][j];
        }
    }
    printf("(3).D中长度为4的通路(含回路)有 %d 条\n",cnt3);
    //(4).
    int cnt4=0;
    for(int i=1;i<6;i++)
        cnt4+=aaa[i][i];
    printf("(4).D中长度小于或等于4的回路有 %d 条\n",cnt4);
    //(5).
    printf("(5).\n");
    for(int i=1;i<6;i++)
    {
        for(int j=1;j<6;j++)
        {
            printf("1 ");
        }
        printf("\n");
    }
    
    
    
    return 0;

}

写在后面:

总的来说两种方法的难度都是差不多的。都不难。这是第一篇博客,加油!

求知若饥,虚心若愚。

 

 

  • 20
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值