请前辈学长学姐同学们批评指正!
这个是题目:
有向图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;
}
写在后面:
总的来说两种方法的难度都是差不多的。都不难。这是第一篇博客,加油!
求知若饥,虚心若愚。