• Welcome to the world's largest Chinese hacker forum

    Welcome to the world's largest Chinese hacker forum, our forum registration is open! You can now register for technical communication with us, this is a free and open to the world of the BBS, we founded the purpose for the study of network security, please don't release business of black/grey, or on the BBS posts, to seek help hacker if violations, we will permanently frozen your IP and account, thank you for your cooperation. Hacker attack and defense cracking or network Security

    business please click here: Creation Security  From CNHACKTEAM

Recommended Posts

基于BFS的拓扑排序

先将所有得分为0的点放入队列(顺序无关),每次将队列头弹出的点加入拓扑序列,然后将该点所有邻点的得分减1,将得分为0的点加入队列。

当队列为空时,如果所有点都加入到拓扑序列中,则退出完成;否则,图中没有拓扑序列。参考代码

void topo(){

for(int I=1;I=n;i){

if(ind==0){ q . push(I);

ts[tot]=I;}

}

int now,next

而(!q.empty()){

now=q . front();

q . pop();

for(int I=0;信息节点[现在]。size();i){

next=node[now]

if(- ind[next]==0){

q.push(下一个);

ts[tot]=next;

}

}

}

基于DFS的拓扑排序

首先,在图中使用dfs会产生深度搜索树。

qkfhb2mu1le5069.png

叫树边缘的黑色边缘,这些边缘构成了深入搜索优秀教师的一棵树。

红色的边叫做返祖边,这些边指向祖先。

绿色的边叫做前向边,这些边是直的,孙子,孙子。(注意不包括儿子)。

蓝色的边称为水平插入边,这些边上的两个节点没有后代关系(相对于深度搜索优秀教师成为树)。

显然,一个图只有在没有返祖边的情况下才能有拓扑序。

bool dfs(int s){

vis=-1;

int next

for(int I=0;信息节点。size();i){

next=节点

if(vis[next]0)返回false//找到返祖边缘,-1是为了区分后代和祖先。

if(vis[next]==0!dfs(next))返回false

}

vis=1;

ts[tot-]=s;//添加拓扑排序

返回true

}

布尔拓扑(){

tot=n;

bool f=1;

for(int I=1;I=n;i){

if(ind==0vis==0){

f=DFS(I);

if(f==0)返回false

}

}

}

Link to comment
Share on other sites