广度优先搜索(队列)
一个顶点出队列,它的子节点进队列
typedef struct {
char vexs[MAXSIZE];
int arc[MAXSIZE][MAXSIZE];
int numV, numE;
} MGraph;
bool visited[MAX];
void DFSTraverse(MGraph G) {
for (int i = 0; i < G.numV; i++) {
visited[i] = false;
}
for (int i = 0; i < G.numV; i++) {
if (!visited[i]) { // 若是连通图,只会执行一次
DFS(G, i);
}
}
}
void BFSTraverse(MGraph G) {
Queue Q;
for (int i = 0; i < G.numV; i++) {
visited[i] = false;
}
for (int i = 0; i < G.numV; i++) {
if (!visited[i]) {
Q.enque(i);
visited[i] = true;
while (!Q.empty()) {
int t = Q.deque();
for (int j = 0; j < G.numV; j++) {
if (G.arc[t][j] && !visited[j]) {
Q.enque(j);
visited[j] = true;
}
}
}
}
}
}
深度优先搜索(栈)
void DFS(MGraph G, int i) {
visited[i] = true;
for (int j = 0; j < G.numV; j++) {
if (G.arc[i][j] && !visited[j]) {
DFS(G, j);
}
}
}
void DFSTraverse(MGraph G) {
for (int i = 0; i < G.numV; i++) {
visited[i] = false;
}
for (int i = 0; i < G.numV; i++) {
if (visited[i]) { // 若是连通图,只会执行一次
DFS(G, i);
}
}
}
关于图的一点笔记
- 环:路径最终会回到起始点
- 任意两点之间是连通的=>连通图,有向=>强连通图
- 最小生成树(构造连通网的边总权最小)
Prim算法:从一个点出发选相距最近且不会成环的另一个点;
Kruaskal算法:选最短边且不成环 - 。。。。太难记住了。。。
参考
《大话数据结构》