图:基本概念
图
{
有向图{
弧:连接线 ——
无箭头——初始点(弧尾)
箭头处——“终端点”(弧头)
入度:-->(远离、逃离顶点的数目)
出度:<--(靠近、顶点的数目)
描述:<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、链式存储结构: