拓扑排序toposort 模板

对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个    线性序列
拓扑排序方法如下:
(1)从有向图中选择一个没有前驱(即入度为0)的顶点并且输出它.
(2)从网中删去该顶点,并且删去从该顶点发出的全部有向边.
(3)重复上述两步,直到剩余的网中不再存在没有前趋的顶点为止.
拓扑排序常用来确定一个依赖关系集中,事物发生的顺序

int* d=new int[n];
int graph[narray][narray]; //邻接阵 
int indegree[narray]; //记录顶点的入度 
int n; //n为顶点个数 
memset(graph,0,sizeof(graph));
memset(indegree,0,sizeof(indegree));
for(i=1;i<=n;++i) //遍历n次每次找出一个顶点 
{
    for(j=1;j<=n;++j) //遍历所有的结点 
    {
        if(indegree[j]==0)
        {
            indegree[j]--; //该顶点的入度为-1,防止该顶点被在此遍历到 
            if(i!=n) printf("%d ",j);
            else printf("%d\n",j);
            for(k=1;k<=n;++k)
            {
                 if(graph[j][k])
                     indegree[k]--; //与该顶点关联的顶点的入度递减 
            }
            break;
        }
    }
}





bool dfs(int u)  
{  
    c[u]=-1;  //标记为正在被访问  
    for(int i=head[u];i!=-1;i=edge[i].next){  
        int v=edge[i].v;  
        if(c[v]<0) return false; //再一次被访问,说明是有环图  
        else if(!c[v]&&!dfs(v)) return false;  
    }  
    c[u]=1;topo[--t]=u;  
    return true;  
}  
  
  
bool toposort()  
{  
    t=n;  
    memset(c,0,sizeof c);  
    for(int u=1;u<=n;++u){  
        if(!c[u]){  
            if(!dfs(u)) return false;  
        }  
    }  
    return true;  


你可能感兴趣的:(#,各种模板)