我是自动化专业的应届研究生,最终拿到了tplink、华为、vivo等公司的ssp的offer,分享自己学习过的计算机基础知识(C语言+操作系统+计算机网络+linux)以及数据结构与算法的相关知识,保证看完让你有所成长。
欢迎关注我,学习资料免费分享给你哦!还有其他超多学习资源,都是我自己学习过的,经过过滤之后的资源,免去你还在因为拥有大量资源不知如何入手的纠结,让你体系化学习。
图的概念
图就是有一些顶点,顶点之间有一些边,这样就构成了一个图。所以对于图这种数据结构,关键点就是顶点和边,就是描述顶点和边的关系。然后对于边呢,对于某些问题来说,还可能有权重,以城市之间的航班为例,各个城市就是顶点,航线就是边,不同的航线票价不同,这个票价就是权重,所以根据边有无权重,分为有权图和无权图。根据边是否是单方向,就是顶点A和B之间有一条边,如果只能沿着这条边单方向的从A到B或者从B到A,而不是既可以从A到B也可以从B到A的,这种图就是有向图。
无向图:
有向图:
有权图:
在一个无向图中,如果任意的两个顶点,都可以找到一个路径,让他俩连通,那么这个图就是连通图。否则就不是。
连通图:任意两个节点之间都可以找到通路
非连通图:ABCD任意一个顶点都不能找到到达E和F的通路。但是ABCD是一个连通图。
图的邻接矩阵的实现
所谓邻接矩阵就是用二维矩阵(就是二维数组)来表示顶点之间的关系。二维矩阵是一个方阵,大小就是顶点数*顶点数,如果顶点i和顶点j之间有一条边,如果是无向图则,G[i][j]=1,G[j][i]=1。如果是有向图,假设只是从i指向j那么G[i][j]=1。对于有权图,那么这个矩阵的值就是权值,然后两个顶点之间没有边,可以让G[i][j]等于一个权值永远不会相等的数来表示没有边。
代码如下
typedef struct EdgeNode //边的定义,方便为图插入边,如果是有权图,添加一个权重变量即可
{
int begin;
int end;
}* Edge;
#define MAX_NV 11 //定义图的最大顶点数目,当然也可以使用动态数组生成一个二维数组
typedef struct Graph //如果是有权图,添加一个权重变量即可
{
int Nv;//顶点数
int Ne;//边数
int G[11][11];//边的关系,两个顶点i和j之间有边,则置1
}* Graph;
Graph creatGraph(int Nv,int Ne)//输入顶点数和边数,创建一个图,返回图的指针。
{
Graph graph;
int i,j;
graph=(Graph)malloc(sizeof(struct Graph));
if(graph==NULL)
{
printf("内存不足\n");
return NULL;
}
graph->Ne=Ne;
graph->Nv=Nv;
for(i=0;i<graph->Nv;i++)//全部初始化为没有边
{
for(j=0;j<graph->Nv;j++)
{
graph->G[i][j]=0;
}
}
return graph;
}
void insert(Graph graph,Edge e)//插入边,这里是无权图&#