拓扑排序

kahn算法:

1. 在有向图中选一个入度为零的点,并输出

2. 从图中删除所有与该点相关的边

3. 重复上述两步,直至所有顶点输出,或者当前图中不存在无前驱的顶点为止,后者代表我们的有向图是有环的,因此,也可以通过拓扑排序来判断一个图是否有环。

void kahn()
{
    stack<int> s;
    int r[6]; //记录每个点的入度
    for(int i=0;i<6;i++){
        r[i]=0;
    }
 
    //统计每个点的入度
    int num=0;
    for(int i=0;i<6;i++){
        num=0;
        for(int j=0;j<6;j++){
            if(a[j][i] == 1) num++;
        }
        r[i]=num;
    }
 
    //把入度为零的入栈
    for(int i=0;i<6;i++){
        if(r[i]==0) s.push(i);
    }
 
    //count用于计算输出点的个数
    int count=0;
    while(!s.empty()){
        int x=s.top();
        s.pop();
        cout<<x<<endl;
        for(int i=0;i<6;i++){
            if(a[x][i] == 1){
                r[i]--;
                if(r[i]==0) s.push(i);
            }
        }
        count++;
    }
 
    if(count == 6) cout<<"此图无环"<<endl;
    else cout<<"此图有环"<<endl;
}

深度优先搜索:

void DFS(int u)
{
    visit[u] = true;
    for(int i=0;i<6;i++){
        if(a[u][i]==1 && visit[i]==false){
            DFS(i);
        }
    } 
   // 每次在递归结束时入栈
    // 即当前顶点没有指向其他顶点的边了,也就是一条路径的最后一个顶点
    s.push(u);
}

  

原文地址:https://www.cnblogs.com/jiangxiaobin1996/p/9309938.html