有向图的邻接矩阵的平方运算的含义
2014-10-04 19:45
155 查看
有向图的邻接矩阵的平方运算的含义
这是《图论算法应用》第一章的一题作业,搞了现在,线性代数太差了。嘿嘿
先上代码:
题目要求写出有向图邻接矩阵的平方后的矩阵,然后说出其中的含义,写代码将近一个多小时,想含义将近半个点儿,期间求助于百度,360无果,线性代数资料太少,差点看教学视频了,我也是醉了的人啊。
在平方后我们依然得到了一个二维矩阵,其中的每个元素值的含义是以有向图中节点的直接邻接点是否可达为准。
用图描述
图1 有向图
图2 有向图的邻接矩阵表示
图 3有向图的平方后的矩阵
就是以1节点的邻接点2为准,这个邻接点所有的邻接点3,也就是说图3中第一行第三个元素的值为1表示1节点可以通过它的邻接点2访问到3,同理第二行最后一个元素为1表示节点2可以通过3访问到4,,当然元素为0表示该节点不能间接到达,当元素值为1表示有一条路径可以到达,元素值为2的时候有两条路径可以到达。
这种邻接矩阵的平方相当于做一次广度优先搜索遍历,如果再将得到的邻接矩阵再次平方则表示通过二次间接方式测试节点间是否可达。也就是说从开始节点通过两个邻接点后是否可以到达第三个邻接点。
本次作业鉴定完毕。
这是《图论算法应用》第一章的一题作业,搞了现在,线性代数太差了。嘿嘿
先上代码:
#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的时候有两条路径可以到达。
这种邻接矩阵的平方相当于做一次广度优先搜索遍历,如果再将得到的邻接矩阵再次平方则表示通过二次间接方式测试节点间是否可达。也就是说从开始节点通过两个邻接点后是否可以到达第三个邻接点。
本次作业鉴定完毕。
相关文章推荐
- 浅析图的邻接矩阵进行平方运算的含义
- 浅析图的邻接矩阵进行平方运算的含义
- 图论中不带权的图的邻接矩阵的平方的意义
- 大数运算——加减乘除和求平方根
- 各数学运算符号的含义
- 深入理解异或运算 xor 的含义——再探不使用加减乘除实现加法运算、不使用额外空间交换两个变量的值
- 第一篇java,实现加减乘除与平方运算
- 带控制端的逻辑运算电路_分别完成正整数的平方、立方和阶乘的运算verilog语言
- [BZOJ4105][Thu Summer Camp 2015]平方运算
- 求输入数字的平方,如果平方运算后小于 50 则退出
- golang位运算操作符&^含义
- BZOJ4105 [Thu Summer Camp 2015]平方运算 【线段树】
- java实现两个数的加减乘除和平方运算
- 带控制端的逻辑运算电路_分别完成正整数的平方、立方和阶乘的运算verilog语言
- 超长整数的基础运算 算法实现自平方篇
- BZOJ4105 THUSC2015平方运算(线段树)
- SSE 加速运算例子详解:乘法、加法、平方、最小值、最大值、与操作
- BZOJ 4105: [Thu Summer Camp 2015]平方运算
- C# 平方、开方、保留小数 运算
- bzoj4105: [Thu Summer Camp 2015]平方运算 线段树处理一类循环问题