トポロジーの順序付け——C++の中でSTLで実現する

2025 ワード

最近トポロジーの順序付けを学んで、ネット上の多くの人がその実現に対して比較的に複雑であることを発見して、プログラミングの試合に関わらず、やはり実際の開発の中ですべて比較的に時間を費やして、だからC++の中でSTLでこのアルゴリズムの利益を実現するのは言うまでもありません!
まず、トポロジーソートアルゴリズムについて簡単に説明します.
トポロジーソートアルゴリズムは主に、0の頂点が存在しないまで、次の2つのステップをループします.
(1)入度0の頂点を選択して出力する.
(2)この頂点とすべてのアウトエッジをネットワークから削除します.
ループが終了すると、出力される頂点数がネットワーク内の頂点数より小さい場合、「ループあり」情報が出力されます.そうしないと、出力される頂点シーケンスはトポロジーシーケンスです.
トポロジーソートアルゴリズムの運用範囲は非常に広いので,深く理解する必要がある.
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
次に、私のプログラム実装について説明します.
入力
第1行は2つの整数nとmを入力し、nは途中ノード数を表し、mは途中エッジ数を表す.次にm行を入力します.各行には2つの整数v 1とv 2があり、v 1とv 2はそれぞれv 1、v 2のノードを表し、各行はv 1がv 2を指すエッジを表します(ノード番号は0から始まります).
しゅつりょく
途中にリングがある場合は、ヒントを与えます.そうでなければ、トポロジソート後のシーケンスを出力します.
ソース:
#include 
#include 
#include 
#include 
using namespace std;

vector> Adj; //   
vector inDegree; //         
stack stk; //       0     

void CreatGraph()
{
	int n, m, v1, v2;
	cin >> n >> m;
	Adj.assign(n, list());
	inDegree.assign(n, 0);
	while (m--)
	{
		cin >> v1 >> v2;
		Adj[v1].push_back(v2);
		inDegree[v2]++;
	}
	for (int i = 0; i < n;i++)
		if (inDegree[i] == 0) stk.push(i);
}
void tpSort()
{
	vector vec;
	int v;
	while (!stk.empty())
	{
		v = stk.top();
		stk.pop();
		//inDegree[v] = -1;
		//     v     
		for (auto it = Adj[v].begin(); it != Adj[v].end(); it++)
		{
			inDegree[*it]--;
			if (inDegree[*it] == 0) stk.push(*it);
		}
		//Adj[v].clear(); //      ,       
		vec.push_back(v);
	}
	if (vec.size() != inDegree.size())
	{
		cout << "      ,        !
"; return; } for (auto item : vec) cout << item << " "; cout << endl; } int main() { CreatGraph(); tpSort(); system("pause"); return 0; }