图的基本概念和邻接矩阵存储结构

图:基本概念

{

    有向图{
        弧:连接线    ——
        无箭头——初始点(弧尾)
        箭头处——“终端点”(弧头)
        入度:-->(远离、逃离顶点的数目)
        出度:<--(靠近、顶点的数目)
        描述:<v1,v2>
    }
    无向图{
        边:连接线   ——
        描述:(v1,v2)
    }
    路径和回路:
        路径:v1到v2途径的所有顶点的集合
        回路:回环
        简单路径:顶点都不重复
        简单回路:顶点都不重复
    权:每条边(弧)赋予一个实数,这个实数就是权。
    网:带权的图。
    子网:网的某一部分。
    ·存储结构分类{
        完全图:各个顶点除自身外,都和自身有关系。
        连通图:存在一个路径,任意2个顶点都能够连通。
            {
                连通分量:无向图不是连通图,但图中存储某个子图符合连通图的性质。
                    有向图:强连通图,强连通分量。
            }
        稀疏图:
        稠密图:
    }
}

·定义代码
1、顺序存储结构:
{

typedef enum {DG, DN, UDG, UDN} GraphKind;	//有向图 有向网 无向图 无向网
//顶点关系结构体
typedef struct {
	int adj;//顶点关系 无权图(1相邻 0不相邻)带权图(直接为权值)
	char *info;//边的其他信息。(可省略)
} VertexType;

//图结构体(邻接矩阵 顶点数、边数 顶点数组 图的种类)
typedef struct {
	VertexType arcs[20][20];//邻接矩阵
	char vexs[20];//顶点数组
	int vexnum, arcnum; //顶点数和边的数量
	GraphKind kind;
} MGraph;
//创建有向图
void CreateDG(MGraph *G) {
	//1输入边、顶点数量 在依次输入顶点数据
	scanf("%d,%d", &(G->vexnum), &(G->arcnum));
	for (int i = 0; i < G->vexnum; i++) {
		scanf("%c", &(G->vexs[i]));
	}
	//2初始化二维矩阵
	for (int i = 0; i < G->vexnum; i++) {
		for (int j = 0; j < G->vexnum; j++) {
			G->arcs[i][j].adj = 0;
			G->arcs[i][j].info = NULL;
		}
	}
	//3在邻接矩阵中添加边与边的关系或者权值
	for (int i = 0; i < G->vexnum; i++) {
		int v1, v2;
		scanf("%d,%d", &v1, &v2);
		int n = LocateVex(G, v1);
		int m = LocateVex(G, v2);
		if (m == -1 || n == -1) {
			printf("no this vertex\n");
			return;
		}
		G->arcs[n][m].adj = 1;
	}
}
//创建无向图
void CreateDN(MGraph *G) {
	//输入边、顶点数量 在依次输入顶点数据
	scanf("%d,%d", &(G->vexnum), &(G->arcnum));
	for (int i = 0; i < G->vexnum; i++) {
		scanf("%c", &(G->vexs[i]));
	}
	//初始化二维矩阵
	for (int i = 0; i < G->vexnum; i++) {
		for (int j = 0; j < G->vexnum; j++) {
			G->arcs[i][j].adj = 0;
			G->arcs[i][j].info = NULL;
		}
	}
	//3在邻接矩阵中添加边与边的关系或者权值
	for (int i = 0; i < G->vexnum; i++) {
		int v1, v2;
		scanf("%d,%d", &v1, &v2);
		int n = LocateVex(G, v1);
		int m = LocateVex(G, v2);
		if (m == -1 || n == -1) {
			printf("no this vertex\n");
			return;
		}
		G->arcs[n][m].adj = 1;
		G->arcs[m][n].adj = 1;
	}

}
//构造无向网
void CreateUDN(MGraph *G){
	//输入边、顶点数量 在依次输入顶点数据
	scanf("%d,%d", &(G->vexnum), &(G->arcnum));
	for (int i = 0; i < G->vexnum; i++) {
		scanf("%c", &(G->vexs[i]));
	}
	//初始化二维矩阵
	for (int i = 0; i < G->vexnum; i++) {
		for (int j = 0; j < G->vexnum; j++) {
			G->arcs[i][j].adj = 0;
			G->arcs[i][j].info = NULL;
		}
	}
	//3在邻接矩阵中添加边的权值
	for (int i = 0; i < G->vexnum; i++) {
		int v1, v2,w;
		scanf("%d,%d,&d", &v1, &v2,&w);
		int n = LocateVex(G, v1);
		int m = LocateVex(G, v2);
		if (m == -1 || n == -1) {
			printf("no this vertex\n");
			return;
		}
		G->arcs[n][m].adj = w;
		G->arcs[m][n].adj = w;	//无向网对角对称
	}
}


}
2、链式存储结构:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值