邻接矩阵
概念:用两个数组来表示图的相关关系.一个一维数组用来储存数组的顶点信息,另一个二维数组用来存储边(或弧)的信息。一般是设计为有则为1,无则为0(总之就是以数值不太能区分).
以此图为例,A→B 为1,而 A→D 则为0.
以此图为例,1→5 为0, 5→1就为1了!
(无向图是对称矩阵)
网
概念:边(或弧)上带有权值的图就叫做网.
权值
概念:定义的路径上面的值.作用随情况而定
路径
概念:指的是图(包括有向图和无向图)里面连接两个结点之间的边的集合,也就是一个顶点序列
……
算法实现思维
:以带权值的来讨论,就有三个数据需要考虑,权值储存、顶点数储存、边(或弧)的存在与否储存.
权值:可正,可负,可为零(int数据类型足以).
顶点:用一个一维数组储存.
边(或弧):用一个二维数组,存在就储存权值,不存在就为默认的无穷大值即可.
算法实现
//构造结构体
typedef char VertexType;//顶点类型由用户决定
typedef int EdgeTpye;//边(或弧)的类型也由用户决定
#define MAXVEX 100 //最大顶点数也由用户决定
#define INFINITY 56789 //设置无穷大
typedef struct {
VertexType vex[MAXVEX];//顶点表(数组)
EdgeType arc[MAXVEX][MAXVEX];//边表,储存权值(边或弧)
int numVertexes,numEdges;//相对应为顶点数和边数.
}MGraph;
//无向图的邻接矩阵表示
void CreateMGraph(MGraph *G)
{
int i, j ,k ,w;
printf("请输入顶点数和边数(用空格隔开):");
scanf("%d %d",&G->numVertexes,G->numEdges);
puts("\n接下来请输入顶点信息:");
for(i=0; i<G->numVertexes; ++i)
{
fflush(stdin);//清楚缓冲区(消除回车对字符读入的影响)
printf("第%d个:",i+1);
scanf("%c",&G->vex[i]);
printf("\n");
}
for(i=0; i<G->numVertexes; ++i){
for(j=0; j<G->numEdges; ++j){
G->arc[i][j]=INFINITY;//设置边(或弧)的初始值为无穷大
}
}
for(k=0; k<G->numEdges; ++k){
printf("请输入(Vi,Vj)上的上标i,下标j和权值w(空格隔开):");
scanf("%d %d %d",&i,&j,&w);
G->arc[i][j]=w;//将对应边的权值记录
G->arc[i][j]=G->arc[j][i];//此行代码只有无向图才适用,因为是对称矩阵
}