//深度优先实现拓扑排序
//以邻接表为例
int visited[Vnum];
int finished[Vnum];//0-1数组,表示是否完成对结点i的DFS访问,用于判断贿赂
void dfs1(graph *g, int v, int &flag) {
//深度优先遍历时输出顶点号,如图中不存在还,会输出全部顶点
arcnode *p;
cout << v << ' ';
finished[v] = 0; //有些难理解,根据后面条件,这是为了回到v时能判断出有回路
visited[v] = 1;
p = g->adjlist[v].firstarc;//开始遍历邻接表
while (p != nullptr) {
if (visited[p->adjvex] == 1 && finished[p->adjvex] == 0) { //在算法结束前出现回路(访问到已访问的结点
flag = 0;
} else if (visited[p->adjvex] == 0) {
dfs1(g, p->adjvex, flag);
finished[p->adjvex] = 1;
}
p = p->nextarc;
}
}
int dfs_toposort(graph *g) {
int flag = 1, i;
for (i = 0; i < g->vexunm; i++) {
visited[i] = 0;
finished[i] = 0;
}
i = 0;
while (flag == 1 && i < g->vexnum) {
if (visited[i] == 0) {
dfs1(g, i, flag);
} else {
i++;//找下一个继续
}
finished[i] = 1;//顶点i的搜索已结束
}
return flag;
}
【图】DFS实现拓扑排序
最新推荐文章于 2024-07-23 17:36:37 发布