クラスノート:有向非循環グラフとそのアプリケーション、グラフの接続性

AOVネットワーク

AOVネットワーク:エンジニアリングを表す有向グラフでは、アクティビティは頂点で表され、アクティビティ間の優先関係は円弧で表されます。このような有向グラフは、アクティビティを表す頂点のネットワーク、または略してAOVネットワークと呼ばれます。
AOVネットワークとトポロジーソート
AOVネットワークの機能
1. AOVネットワークの弧は、アクティビティ間の特定の制限的な関係を示します。
2. AOVネットワークでループが発生することはありません。
トポロジカルソート
トポロジシーケンス:G =(V、E)をn個の頂点を持つ有向グラフとすると、頂点のシーケンスv1、v2、…、Vのvnは、次の条件が満たされた場合にのみトポロジシーケンスと呼ばれます。頂点viからvjへのパスがある場合、頂点viは、頂点トポロジシーケンスで頂点vjに先行する必要があります。トポロジカルソート:有向グラフのトポロジシーケンスを構築するプロセスは、トポロジカルソートと呼ばれます。
トポロジシーケンスにより、AOVネットワークのすべての先行ノードと後続ノードが満たされます。
基本的なアイデア:(
1)
AOVネットからプリカーサーのない頂点を選択して出力します;(2)AOVネットから頂点を削除し、頂点で終わるすべてのアークを削除します;
(3)すべての頂点ができるまで上記の2つの手順を繰り返します出力またはAOVネットワークにプリカーサがない頂点はありません。
設計データ構造
1.グラフ格納構造:隣接表格納を採用し、頂点表に次数フィールドを追加。
2.スタックS:すべての頂点をプリカーサーなしで保存します(ゼロ次数の頂点)。
隣接リストに基づくトポロジカルソートの基本的な考え方
(1)Gのプリカーサなしで頂点を見つける:次数[i]がゼロである頂点viを見つけます。
(2)頂点iに隣接する頂点の次数を変更します(iを始点とするすべての弧を削除します):頂点iの背後にあるチェーンの隣接するすべての頂点kについて、対応する次数[k]を1だけ減らします。
インディグリーがゼロの頂点が繰り返し検出されるのを防ぐために、補助スタックを設定できます。特定の頂点のインディグリーが0に減少すると、スタックにプッシュされます。入力次数が0の頂点が出力されるたびに、その頂点はスタックから削除されます。
トポロジカルソートアルゴリズム-疑似コード
1.スタックSの初期化;アキュムレータカウントの初期化;
2.頂点テーブルをスキャンし、前のものなしで頂点をスタックにプッシュする;
3.スタックSが空でないときにループする
3.1 vj =スタックの最上位要素を終了する;出力vj;アキュムレータは1
ずつ増加します; 3.2は頂点vjの各隣接点の次数を1だけ減少します;
3.3は0度の新しい頂点をスタックに入れます;
4. if(count <vertexNum)がループ情報を出力します;

void TOpSort(){ 
	int  top=-1, count=0; 
	for(int i=0;i<vertexnum;i++)      
		if(adjlist[i].in==0) 
			s[++top]=i; 
	while(top!=-1){     
		j=s[top--]; 
		cout <<adjlist[j].vertext;   
		count++;
		p=adjlist[j].firstedge;     
		while(p!=NULL){           
			k=p->adjvex; 
			adjlist[k].in--;          
			if(adjlist[k].in==0) 
				s[top++]=k;          
			p=p->next;
		}  
	} 
	if (count<vertexNum) 
		cout<<"有回路";
}

クリティカルパス

AOEネットワーク:プロジェクトを表す重み付きの有向グラフでは、イベントは頂点で表され、アクティビティは有向エッジで表され、エッジ上の重みはアクティビティの期間を表します。このような有向グラフは、アクティビティを表すエッジのネットワークと呼ばれます。 、AOEネットワークと呼ばれます。
入力エッジがないAOEネットワークの頂点は、開始ポイント(またはソースポイント)と呼ばれ、出力エッジがない頂点は、終了ポイント(またはシンクポイント)と呼ばれます。開始
:この頂点で表されるイベントには前提条件がなく、最初に開始できます。
終了点:プロジェクトの終了を示します。
通常のAOEネットワークには、開始点と終了点が1つずつあります。
AOEネットワークの性質:(
1)頂点によって表されるイベントが発生した後にのみ、頂点から始まるアクティビティを開始できます;(2)頂点によって表されるイベントは、頂点に入るすべてのアクティビティが終了したときにのみ発生します。
AOEネットワークは、次の質問に答えることができます
少なくとも、プロジェクトを完了するのに必要とされているどのくらいの時間1?
つ以上のかもしれ開始点からパスの終点まで、各パス上の唯一のすべてのアクティビティが完了し、プロジェクト全体が完成します。したがって、プロジェクト全体を完了するために必要な最小時間は、開始点から終了点までの最長のパスの長さに依存します。これは、このパス上のすべてのアクティビティの合計時間です。パスが最も長いパスをクリティカルパスと呼びます
2.プロジェクトの完了に必要な時間を短縮するために、どのアクティビティを加速する必要がありますか?
クリティカルパス:AOEネットワークでは、開始点から終了点までの最大パス長(パス上のアクティビティの継続時間の合計)を持つパスが呼び出されますクリティカルパス。
キーアクティビティキーパス上のアクティビティは、キーアクティビティと呼ばれます。
クリティカルパスを見つけるには、主要なアクティビティ、つまりスケジュールどおりに完了しなかった場合にプロジェクト全体の完了に影響を与えるアクティビティを見つける必要があります。
まず、主要なアクティビティに関連する次の量を計算します。(
1)イベントの最も早い発生時間ve
[k]
イベントの最も遅い発生時間vl [k] ⑶アクティビティの最も早い開始時間e [i]
アクティビティの最も遅い開始時間l [ i]

最後に、各アクティビティの時間マージンl [k] -e [k]を計算します。主要なアクティビティは時間マージン0です。
ストレージ構造の選択
処理の便宜上、隣接行列エッジセット配列の 2つのストレージ構造が同時に使用されます。
隣接行列は、隣接点を簡単に見つけて、最早および最新の発生時間の計算を完了することができます。
エッジセット配列は、アクティビティの時間の最新の時間を便利に計算できます。

struct Edge{  
	int from;  
	int to;  
	int e;  
	int l; 
};
class Grap{  
	int vertexnum,e;  
	int **adjlist;
	int start,end;  
	Edge *edge;
public:  
	Grap(int n,int e);  
	int  path(); 
};

theイベントの最も早い発生時間ve [k]
ve [k]は、最初から頂点vkまでの最大パス長を指します。この長さは、頂点vkから送信されたすべてのアクティビティを開始できる最も早い時間を決定します。
ve [1] = 0
ve [k] = max {ve [j] + len <vj、vk>}(<vj、vk>∈p[k])
p [k]はvkに到達するすべての有向エッジを表すコレクション
は、すべての事前イベントが終了したことを保証します。
theイベントvl [k]
vl [k] の最新の発生時刻は、構築期間全体を遅らせることなく、イベントvkに許可される最新の時刻を指します。
vl [n] = ve [n]
vl [k] = min {vl [j] -len <vk、vj>}(<vk、vj>∈s[k])
s [k]はすべてvkから送信されます有向エッジの
最小セットにより、この時点でイベントが発生した場合でも、後続の作業を正常に進めることができます。
theアクティビティeの最も早い開始時間e [i]
アクティビティaiが弧<vk、vj>で表される場合、アクティビティaiの最も早い開始時間は、イベントvkの発生の最も早い時間と等しくなければなりません。したがって、次のようになります。e [i] = ve [k]
activityアクティビティの最新の開始時刻l [i]
アクティビティaiの最新の開始時刻は、aiが建設期間全体を遅らせることなく開始する必要がある最新の時刻を指します。 。aiがarc <vk、vj>で表される場合、aiの最新の開始時刻は、イベントvjの最新の発生時刻が遅延しないようにする必要があります。したがって、次のようになります。l [i] = vl [j] -len <vk、vj>

グラフ接続

無向グラフの
順序が結果を取得する有向グラフのトラバーサルにより、無向グラフの接続グラフ、又はいくつかの連結成分であるか否かを決定します。
接続されたグラフグラフ内のすべての頂点にアクセスするには、グラフ内の任意の頂点から開始し、深さ優先検索(または幅優先検索)を実行するだけです。
非接続グラフ:複数の頂点から検索する必要があり、毎回新しい開始点から検索プロセスから取得された頂点アクセスシーケンスは、各接続コンポーネントの頂点のセットです。
グラフの接続性-
無向グラフの接続コンポーネント見つけるためのトラバーサル法の適用(非接続グラフのトラバーサル法)
1. count = 0;
2の
場合(グラフの各頂点v)2.1(vにアクセスしていない場合)
2.1.1 count ++;
2.1.2 v(関数呼び出し)から開始してグラフをトラバースする;
3. if(count == 1)cout <<「グラフが接続されている」;
else cout <<「グラフが持っている」<< count <<「接続されたコンポーネント」;
有向グラフの接続されたグラフ有向グラフの
接続されたサブグラフの解決プロセス
⑴頂点からの深さ優先のトラバーサルから開始し、そのすべての隣接要素が訪問される順序に従います頂点を配置します。
the最後に訪問を完了した頂点から開始して、深さ優先のトラバーサルは、頂点に向かう弧に沿って実行されます。すべての頂点にアクセスできない場合は、残りの頂点で最後にアクセスした頂点から始めて、有向グラフのすべての頂点にアクセスするまで、逆の深さ優先トラバーサルを続けます。

公開された48件の元の記事 いいね25 2453にアクセス

おすすめ

転載: blog.csdn.net/qq_43628959/article/details/103341639