拓扑排序 DFS实现

拓扑排序,必须是有向无环图。

在任一有向无环图中,必然存在出度为0的顶点。否则,每个顶点都至少有一条出边,这意味着包含环路。

在对有向无环图的DFS搜索中,首先因访问完成而转换至VISITED状态的顶点m,其出度必然为0。

基于上述两条特性,我们可以得出结论:

DFS搜索过程中各顶点被标记为VISITED的次序,恰好(按逆序)给出了原图的一个拓扑排序。

代码:

#include <iostream>
#include <string>
#include <cstdlib>
#include <sstream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <map>
#include <math.h>
#include <stack>
using namespace std;

stack<int> s; ///用来保存逆序
int graph[100][100]; ///邻接矩阵存储,节点从0开始

int visited[100];
int n; ///节点个数
int e; ///用来存边的条数

void dfs(int v){
    visited[v] = 1;
    for(int i=0;i<n;i++){
        if(graph[v][i]==1&&visited[i]==0){
            dfs(i);
            if(visited[i]==1)
                s.push(i);
        }
    }
}

void solve(){
    ///初始化
    scanf("%d",&n);
    scanf("%d",&e);
    for(int i=0;i<e;i++){
        int v1,v2;
        scanf("%d%d",&v1,&v2);
        graph[v1][v2]=1;
    }
    ///dfs过程
    for(int i=0;i<n;i++){
        if(visited[i]==0){
            dfs(i);
            if(visited[i]==1)
                s.push(i);
        }
    }

    ///输出入
    while(!s.empty()){
        printf("%d ",s.top());
        s.pop();
    }
}

int main() {
    solve();
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/xiaoxb17/p/12932047.html