トポロジカル整列の詳細なアルゴリズム

用語集

・(点):無向グラフ、及び点に接続されたエッジストリップの数の

・ペネトレーション:図の場合は、そのエンドポイントのエッジの数です

・度図の場合、出発点は、その点のエッジの数であります

・(2点)パス:開始点を順次終了するまで、次の点に縁部に沿って移動するから、これを介してポイント及び/又は縁なし要件は側の端縁に開始点から図運動に有していない場合にのみ

・サークル:一点から独自のパスに、多くの場合、リングと呼ばれます

・非循環有向グラフ(DAG):全く環状有向グラフを含みません

トポロジカルソート

・ソートと配列は何もありません

・DAGの頂点は、必要な結果をソートします

  • 各頂点は、一度だけ表示され、

  • UがVの前に頂点の(u、v)は、場合UのVから、パスのない存在をソート

・これは、Uは、Uの前に表示されている頂点の全ての点に到達するためにアクセスすることができると理解することができます

*一般的な手順は、情報処理ノードをソートするようになり、結果は明示的である必要はありません

アルゴリズムのプロセス

・図の構築における各点の第一度記録。

•キューを確立し、次のステップでは、キューのアクセスポイントに参加することです

•すべての点0の始まりはアクセスすることができ、キューに参加

・キューから削除順番に各点Uについて、そのエッジを列挙し、端縁は、Vであります

様々なU-> V・ここで情報を更新します

情報が既に計算されているのでUは・、Uは、図からVへの度合いを省略対応-1

・このとき、vは前処理された情報その後、0であれば、キューイング

コード:

int ind[MAXN];
int d[MAXN];
int q[MAXN], qhead = 0, qtail = 0;

void topo() {
    for (int i = 1; i <= n; i++) {
        if (!ind[i]) q[qtail++] = i;
    }
    while (qhead != qtail) {
        int now = q[qhead++];
        for (int i = he[now]; i; i = ne[i]) {
            Edge &e = ed[i];
            d[e.to] = max(d[e.to], d[now] + 1);
            if (!--ind[e.to]) q.push_back(e.to);
        }
    }
}

おすすめ

転載: www.cnblogs.com/hulean/p/11123024.html