有向图的邻接矩阵的平方运算的含义
这是《图论算法应用》第一章的一题作业,搞了现在,线性代数太差了。嘿嘿
先上代码:
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#define MAXN 100
//有向图的邻接矩阵的乘法运算
using namespace std;
int Edge[MAXN][MAXN];
int newEdge[MAXN][MAXN];
int main(int argc, char *argv[]) {
int num ; //测试案例个数
int i,j , k,q; //循环变量
int vertexNum ; //有向图顶点的个数
int arcNum ; //有向图边的个数
int start,end ; //起点和终点
scanf("%d",&num);
while(num--){
scanf("%d%d",&vertexNum,&arcNum);
if(vertexNum == 0 && arcNum ==0 ){
break;
}
memset(Edge,0,sizeof(Edge));
memset(newEdge,0,sizeof(newEdge));
for(i=0 ;i < arcNum;i++){
scanf("%d%d",&start,&end);
Edge[start - 1][end - 1] = 1; //注意序号减一
}
for(i =0 ;i < vertexNum;i++){
for(j = 0; j < vertexNum;j++){
if(j == 0){
printf("%d",Edge[i][j]);
}else{
printf(" %d",Edge[i][j]);
}
}
printf("\n");
}
printf("\n\n");
for(i = 0 ;i< vertexNum ;i++){
int tempArray [100];
memset(tempArray,0,sizeof(tempArray));
for(k = 0 ; k < vertexNum;k++){
tempArray[k] = Edge[i][k];
}
for(q = 0 ;q < vertexNum;q ++ ){
int sum = 0 ;
for(j = 0 ;j < vertexNum ;j ++){
sum = sum+Edge[j][q]*tempArray[j];
}
newEdge[i][q] = sum ;
}
}
for(i =0 ;i < vertexNum;i++){
for(j = 0; j < vertexNum;j++){
if(j == 0){
printf("%d",newEdge[i][j]);
}else{
printf(" %d",newEdge[i][j]);
}
}
printf("\n");
}
}
return 0;
}
题目要求写出有向图邻接矩阵的平方后的矩阵,然后说出其中的含义,写代码将近一个多小时,想含义将近半个点儿,期间求助于百度,360无果,线性代数资料太少,差点看教学视频了,我也是醉了的人啊。
在平方后我们依然得到了一个二维矩阵,其中的每个元素值的含义是以有向图中节点的直接邻接点是否可达为准。
用图描述
图1 有向图
图2 有向图的邻接矩阵表示
图 3有向图的平方后的矩阵
就是以1节点的邻接点2为准,这个邻接点所有的邻接点3,也就是说图3中第一行第三个元素的值为1表示1节点可以通过它的邻接点2访问到3,同理第二行最后一个元素为1表示节点2可以通过3访问到4,,当然元素为0表示该节点不能间接到达,当元素值为1表示有一条路径可以到达,元素值为2的时候有两条路径可以到达。
这种邻接矩阵的平方相当于做一次广度优先搜索遍历,如果再将得到的邻接矩阵再次平方则表示通过二次间接方式测试节点间是否可达。也就是说从开始节点通过两个邻接点后是否可以到达第三个邻接点。
本次作业鉴定完毕。