目录
谢谢帅气美丽且优秀的你看完我的文章还要点赞、收藏加关注
没错,说的就是你,不用再怀疑!!!
希望我的文章内容能对你有帮助,一起努力吧!!!
1、图
图的定义:图(graph)非线性的数据结构,形式描述为:graph=(V,R)
其中V是图中元素Vn(称为顶点Vertex)的集合,当n=0,V是空集
其中R是图中顶点之间的关系集,为顶点vi、vj之间是否存在路径(关系)的判断条件。即vi、vj之 间存在关系,则关系属于R
1.1图的分类
- 有向图(Digraph)
- 有方向的图就是有向图
- 有向图的那个方向的线条称为:弧
- 无向图(Undigraph)
- 没有方向的图就是无向图
- 无向图的那个线条称为:边
- 网:
- 若在图的关系上面,或者是上去附加一个值w,称w为弧上或者是边上的权值。
- 带权的图称为:网(权值w的具体含义在不同的应用场景下去定义,比如:顶点表示城市)
顶点的度
顶点的度:顶点的边或者是顶点的弧条数称为:度
但是有向图分为:入度和出度。
1.2路径
路径:一个顶点到另一个顶点的方式(怎么到达的)
1.3连通图
两个顶点之间存在路径(到达方式),说明它们是连通 。若任意两个顶点之间都是连通的话,则图是连 通图。
有向图则称为:强连通图
2、图的存储结构
数组表示法、邻接表、逆邻接表、十字链表、...
2.1数组表示法
数组表示法:又称邻接矩阵
使用一个二维数组来描述图的顶点之间的关系集R。 G=(V,R)
用一个一维数组来存储图中顶点集V
***示例代码***
cpp
#include <iostream>
// 顶点数量是10个
#define VertexMaxCount 10
// 图类型
typedef struct
{
// 关系集
bool R[VertexMaxCount][VertexMaxCount];
// 顶点集
std::string V[VertexMaxCount];
// 顶点数量
int vertex_count;
}Graph;
// 关系类型
typedef struct
{
int index_s; // 关系开始顶点下标
int index_e; // 关系结束顶点下标
bool r; // 关系
}R;
/*
@brief 为一个邻接矩阵图增加一个顶点
@param graph 需要增加顶点的图指针
@param vertex 需要增加的顶点
*/
void addVertex(Graph *graph,std::string vertex)
{
// 判断图是否存在
if(!graph)
return;
// 添加新顶点
graph->V[graph->vertex_count] = vertex;
// 更新顶点数量
graph->vertex_count++;
}
int getIndex(Graph*graph,std::string vertex)
{
if(!graph)
return -1;
for(int index=0;index < VertexMaxCount;index++)
if(graph->V[index] == vertex)
return index; // 返回顶点在图中的下标
return -1; // 表示顶点不在图中
}
/*
@brief 为一个邻接矩阵图增加关系
@param graph 需要增加关系的图指针
@param r 增加新关系
*/
void addR(Graph *graph,R r)
{
// 判断图是否存在
if(!graph)
return;
// 添加关系
graph->R[r.index_s][r.index_e] = r.r;
}
Graph *creatGraph()
{
// 申请了一个邻接矩阵的空间
Graph * graph = new Graph;
std::cout << "请依次输入顶点:";
// 增加顶点
while(1)
{
std::string vertex = "结束";
std::cin >> vertex;
if(vertex == "结束")
break;
// 增加进入图
addVertex(graph,vertex);
}
// 先初始化关系
for(int row = 0;row < VertexMaxCount;row++)
{
for(int column = 0;column < VertexMaxCount;column++)
if(row == column)
graph->R[row][column] = true;
else
graph->R[row][column] = false;
}
// 增加关系
while(1)
{
std::cout << "请输入顶点之间的关系:";
std::string start_vertex = "结束";
std::string end_vertex = "结束";
std::cin >> start_vertex;
std::cin >> end_vertex;
if(start_vertex == "结束"||end_vertex == "结束")
break;
R r;
r.index_s = getIndex(graph,start_vertex);
r.index_e = getIndex(graph,end_vertex);
r.r = true;
// 判断结点下班是否有效
if(r.index_s == -1||r.index_e == -1)
continue;
// 存入关系
addR(graph,r);
}
return graph;
}
/*
@brief 打印一个邻接矩阵图
@param graph 需要打印的邻接矩阵图指针
*/
void printGraph(Graph *graph)
{
if(!graph)
return ;
std::cout << "\t";
// 打印顶点
for(int count=0;count < VertexMaxCount;count++)
std::cout << graph->V[count] << "\t";
std::cout << std::endl;
// 打印关系
for(int row = 0;row < VertexMaxCount;row++)
{
std::cout << graph->V[row] << "\t";
for(int column = 0;column < VertexMaxCount;column++)
{
// 存在关系
if(graph->R[row][column])
std::cout << "○";
else
std::cout << "×";
std::cout << "\t";
}
std::cout << std::endl;
}
}
int main()
{
Graph *g = creatGraph();
printGraph(g);
delete g;
return 0;
}