図論アルゴリズムのDFSとBFS
5586 ワード
再帰的に使用されるため、ノードが特に多く、深さが大きい場合、スタックオーバーフローが発生する可能性があります.解決策は,再帰を非再帰に変更し,自分でスタックを作成することである.
BFSは、広さ優先探索(幅優先探索とも呼ばれる)であり、連通図の遍歴戦略である.一つの頂点V 0から、その周囲の広い領域を放射状に優先的に遍歴することから名付けられた.普通はそれを使って何ができますか?最も直観的な経典の例は迷宮を歩くことであり、私たちは起点から、終点までの最短距離を見つけ、多くの最短経路アルゴリズムは広さ優先の思想に基づいて成立している.
無方向図の連通成分を求めます:O(n)
1つの図が二分図であるか否かを判断する:O(n)
切頂:無方向図Gについて、ある点uを削除すると、連通成分数が増加すると、uは切頂となる.
ブリッジ:無方向図Gについて、ある点辺eを削除すると、連通成分数が増加すると、eはブリッジとなる.
すべての図の中の割頂と橋を求めます:
方式1:各ノードを削除し,dfsで連通成分が増加したか否かを判断しようとする.時間複雑度:O(n(n+m)).
方法2:各ノードに2つのタイムスタンプを記録し、dfsを深く掘り起こす.時間複雑度:O(n+m).
2.ツリーの階層遍歴
/**
* DFS
* visit false
* @param n
* @param d
* @return
*/
bool DFS(Node n, int d){
if (isEnd(n, d)){// , true
return true;
}
for (Node nextNode in n){// n nextNode
if (!visit[nextNode]){//
visit[nextNode] = true;// ,nextNode
if (DFS(nextNode, d+1)){//
// ,
return true;
}
// false,
visit[nextNode] = false;
}
}
return false;//
}
/**
*
* @param Vs
* @param Vd
*/
bool BFS(Node& Vs, Node& Vd){
queue Q;
Node Vn, Vw;
int i;
// Q
Q.push(Vs);
hash(Vw) = true;// !
while (!Q.empty()){// , !
// Vn
Vn = Q.front();
//
Q.pop();
while(Vw = Vn ){
if (Vw == Vd){// !
// ,
return true;//
}
if (isValid(Vw) && !visit[Vw]){
//Vw
Q.push(Vw);// Q
hash(Vw) = true;//
}
}
}
return false;//
}
http://blog.csdn.net/u011437229/article/details/53188837
http://www.cnblogs.com/George1994/p/6346751.html
転載先:https://www.cnblogs.com/zhongzihao/p/7436660.html