数据结构 五、图 - Touale Cula's Blog

维导图(若加载不出来请刷新网页):

若dist[j] + arcs[j][k] < dist[k],则进行更新
path[]:记录源点到顶点i之间最短路径的前驱结点
dist[]:记录源点V~0~到其他各点的最短路径长度
重复操作
修改V~0~出发到V~k~的最短路径长度:
从顶点选取一个V~j~,满足dist[j] = Min{dist[i] | V~i~ E v-s},即找到一条从V~0~出发的最短路径的终点
初始化:初始化dist[i] = dist[0][i]
算法步骤:
构造辅助数组
若加入后形成回路,则舍弃选择下一条
选取当前未被选过且权值的最小的边
把边按照权值从小到大排序
选择一个与当前顶点集合距离最近的顶点
任取一个顶点
思想:
思想:
思想:
bool visited[MAX_VERTEN_NUM];
void BTSTraverse(Graph G, int v) {
  for(i = 0;i<G.vernum;i++) {
    visited[i] = false;
  }
  InitQueue(Q);
  for(i = 0;i<G.vernum;i++){
    if(!visited[i]) {
      if(!visited[i]){
        BFS(G,i);
      }
  }
}
void BFS(Graph G, int v) {
  visit(v);
  visited[v] = true;
  EnQueue(Q,v);
  while(!QueueEmpty(Q)) {
    DeQueue(Q,w);
    for(w = FirstNeighbor(G,v);w>=0;w = NextNeighbor(G,v,w)) {
      if(!visited[w]) {
        visit(w);
        visited[w] = true;
        EnQueue(Q,w);
      }
    }
  }
}
bool visited[MAX_VERTEN_NUM];
void DTSTraverse(Graph G, int v) {
  for(i = 0;i<G.vernum;i++) {
    visited[i] = false;
  }
  InitQueue(Q);
  for(i = 0;i<G.vernum;i++){
    if(!visited[i]) {
      if(!visited[i]){
        DBFS(G,i);
      }
  }
}
void DFS(Graph G, int v) {
  visit(v);
  visited[v] = true;
  for(w = FirstNeighbor(G,v);w>=0;w = NextNeighbor(G,v,w)) {
    if(!visited[w]) {
      DFS(G,W);
    }
  }
}
①————②
|   /| \
| /  |  \
⑤————④———③
1->2->5
2->1->5->3->4
3->2->2->4
4->2->5->3
5->4->1->2
adjvex | nextarc
data | 边表头指针
Dijkstra算法(迪杰斯特拉算法)
Kruskal算法(克鲁斯卡尔算法)
Prim算法(普利姆算法)
边数等于顶点数减一
最小生成树边权值唯一
最小生成树不是唯一的
代码实现
代码实现
无向图的另一种链式存储结构
表示不唯一,但是一个十字链表可以确定一个图
有向图的一种链式存储结构
无向图
边表结点
顶点表结点
若为稀疏图,使用邻接矩阵法过于浪费空间
有向图:A[i][j]表示权值,0或∞则不存在边
无向图:A[i][j]表是否存在边 0,1
== 强连通图 ==> 最少需要n条边
对于n个结点的有向图G
== 非连通图 ==> 最少需要C~n-2~2条边
== 连通图 ==> 最少需要n-1条边
对于n个结点的无向图G
4.关键路径
3.拓扑排序
2.最短路径
1.最小生成树
2.广度优先搜索
1.深度优先搜索
邻接多重表
十字链表
2.邻接表
1.邻接矩阵
回路对应于路径,简单回路对应简单路径
无向图的全部顶点的度之和等于边数的两倍
强连通图
连通图
简单图、多重图
无向图
有向图
图的基本应用
图的遍历
图的存储及基本操作
图的基本概念