0%

图的操作

图的基本操作

  • Adjacent(G, x, y) 判断图G是否存在边
  • Neighbors(G, x) x的全部边
  • InsertVertex(G, x) 在图G中插入顶点x
  • DeleteVertex(G, x) 从图G中删除顶点x
  • AddEdge(G, x, y) 若无向边(x, y)或有向边不存在,则向图G中添加该边。
  • RemoveEdge(G, x, y) 若无向边(x, y)或有向边存在,则从图G中删除该边。
  • FirstNeighbor(G, x) 求图G中顶点x的第一个邻接点,若有则返回顶点号。若x没有邻接点 或图中不存在x,则返回-1。
  • NextNeighbor(G, x, y) 假设图G中顶点y是顶点x的一个邻接点,返回除y之外顶点x的下一个邻接点的顶点号,若y是x的最后一个邻接点,则返回-1。
  • Get_edge_value(G, x, y) 获取图G中边(x, y)或对应的权值。以及Set_edge_value(G, x, y, v)

图的广度优先遍历BFS

利用队列和FirstNeighbor(G, x) NextNeighbor(G, x, y)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
void BFSTraverse(G)
{
for (int i = 0; i<G.vexnum; ++i)
{
G.visited[i] = false;
}
InitQueue(Q);
for (int i = 0; i<G.vexnum; ++i)
{
if (!G.visited[i])
{
BSF(G, i);
}
}
}

void BSF(G, x)
{
visit(G, x);
G.visited[x] = true;
Enqueue(Q, x);//x入队
while (!isEmpty(Q))
{
DeQueue(Q,v);
for (w = FirstNeighbor(G, v); w >= 0; w = NextNeighbor(G, v, w))
{
if (G.visited[w])
{
continue;
}
visit(w);
G.visit[w] = true;
EnQueue(Q, w)
}
}
}

图的深度优先遍历DFS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
void DFSTraverse(G)
{
for (int i = 0; i<G.vexnum; ++i)
{
G.visited[i] = false;
}
for (int i = 0; i<G.vexnum; ++i)
{
if (!G.visited[i])
{
DSF(G, i);
}
}
}

void DFS(G,x)
{
visit(x);
G.visited[x] = true;
for (w = FirstNeighbor(G, x); w >= 0; w = NextNeighbor(G, v, w))
{
if (G.visited[w])
{
continue;
}
DFS(G,w);
}
}