一些重点概念
- 无向完全图边数 e = n ( n − 1 ) 2 . e=\frac{n(n-1)}{2}. e=2n(n−1).有向完全图边数 n ( n − 1 ) . n(n-1). n(n−1).
- 顶点v的度指的是相关联的边数,TD(v).有向图要分两部分:出度ID(v)和入度OD(v).度数/2是边数
- 简单路径:路径的顶点序列中的顶点各不相同。简单回路:除了第一和最后一个顶点外,不出现相同的顶点。
- 连通图:在无向图中,任意两个顶点都连通,则是连通图。
- 连通分量:无向图中的极大连通子图称为该无向图的连通分量。
- 强连通图:在有向图中, 每对顶点从 v i v_i vi到 v j v_j vj和从 v j v_j vj到 v i v_i vi都有路径。
- 生成树:一个连通图的生成树指一个极小连通子图,含有图中所有顶点,但只有足以构成一棵树的n-1条边,两顶点间仅有一条路径。
图的存储结构
(1)邻接矩阵
(2)邻接表
边表、表头链接表
链域、数据域、邻接点域
(3)邻接多重表
(4)十字链表
图的遍历
深度优先搜索
#define Error -1
#define Ok 1
int visited[MAX_VERTEX_MUM];
//遍历 图
void TraverseGraph(Graph g){
for(vi=0;vi<g.vexnum;vi++){
visited[vi]=0;
}
for(vi=0;vi<g.vexnum;vi++){
if(!visited[vi])
DepthFirstSearch(g,vi);
}
}
//dfs
void DepthFirstSearch(Graph g,int v0){
visit(v0);
visited[v0]=1;
w=FirstAdjVertex(g,v0); //找第一个邻接点
while(w!=-1){ //邻接点存在
of(!visited[w]) DepthFirstSearch(g,w);
w=NextAdjVertex(g,v0,w); //找下一个邻接点
}
}
邻接矩阵实现dfs
//邻接矩阵方式dfs
void DepthFirstSearch(AdjMatrix g,int v0){
visit(v0);
visited[v0]=1;
for(vj=0;vj<g.vexnum;vj++){
if(!visited[vj]&&g.arc[v0][vj].adj==1){
DepthFirstSearch(g,vj);
}
}
}
邻接表实现dfs
//邻接表实现dfs
void DepthFirstSearch(AdjList g,int v0){
visit(v0);
visited[v0]=1;
p=g.vertex[v0].firstarc;
while(p!=NULL){
if(!visited[p->adjvex])
DepthFirstSearch(g,p->adjvex);
p=p->nextarc;
}
}
广度优先搜索
类似于树的层次遍历
//广度优先搜索
void BreadthFirstSearch(Graph g,int v0){
visit(v0);
visited[v0]=1;
InitQueue(&Q);
EnterQueue(&Q,v0);
while(!Empty(Q)){
DeleteQueue(&,&v); //队头出队
w=FirstAdj(g,v); //求v的第一个邻接点
while(w!=-1){
if(!visited[w]){
visit(w);
visited[w]=1;
EnterQueue(&Q,w);
w=NextAdj(g,v,w);
}
}
}
}
bfs原理:bfs原理分析图解
直接看这个文章即可!!!