欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C/C++淺析鄰接表拓撲排序算法的實現(xiàn)

 更新時間:2022年07月27日 10:20:44   作者:菠菠蘿寶  
這篇文章主要介紹了C/C++對于鄰接表拓撲排序算法的實現(xiàn),鄰接表是圖的一種鏈式存儲方法,其數(shù)據(jù)結(jié)構(gòu)包括兩部分:節(jié)點和鄰接點

前言

在軟件開發(fā)、施工過程、教學安排等等的一系列活動中,往往需要一個有向無環(huán)圖來表示其是否成成功進行下去。

在一個有向圖為頂點表示活動的網(wǎng)中,我們稱為AOV網(wǎng)(Activity On Vertex Network)。設G={V,E}是一個具有n個頂點的有向圖,V中的頂點序列v1,v2,…,vn,滿足若從頂點vi到vj有一條路徑,則在頂點序列中頂點vi必在vj之前。則我們稱這樣的頂點為一個拓撲序列。

所謂拓撲排序,其實就是對一個有向圖構(gòu)造拓撲序列的過程。如果所有的頂點被輸出,則說明有向圖中不存在回路,反之則是有回路。

一、拓撲排序算法的思路

拓撲排序往往用在有向鄰接表中,這里也就只用有向鄰接表來實現(xiàn)。

先找出所有節(jié)點的入度。

再在AOV網(wǎng)中選擇一個入度為0的頂點輸出,然后刪除此頂點,將其連接的節(jié)點的入度減一直至輸出所有頂點或者AOV網(wǎng)中不存在入度為0的頂點為止。

二、實現(xiàn)步驟

1.求個頂點的入度

設置一個indegree數(shù)組來存放各個頂點的入度。

int* indegree = (int*)malloc(sizeof(int) * G.vexnum);
//對單個節(jié)點p求入度
void CountIndegree(AdjList g, int* indegree, ArcNode* p) {
	while (p != NULL) {
		indegree[p->adjvex]++;
		p = p->nextarc;
	}
	return;
}

2.拓撲排序的實現(xiàn)

這里對棧的使用還是調(diào)用stl中的stack,比較方便。

bool TopoSort(AdjList g, int* indegree) {
	//先清空申請的indegree數(shù)組,或者也可以在初始化時采用calloc,就不用在這里置為0了
	for (int i = 0; i < g.vexnum; i++) {
		indegree[i] = 0;
	}
	//遍歷邊表中的每一個頂點,用CountIndegree()遍歷單個節(jié)點
	for (int i = 0; i < g.vexnum; i++) {
		ArcNode* p = g.vertexlist[i].firstarc;
		CountIndegree(g, indegree, p);
	}
	stack<int>S;
	//如果該頂點的入度為0,則入棧。
	for (int i = 0; i < g.vexnum; i++) {
		if (indegree[i] == 0) {
			S.push(i);
		}
	}
	//count用來表示已經(jīng)輸出的節(jié)點個數(shù)
	//如果所有的頂點被輸出,則count==g.vexnum,無回路,反之count<g.vexnum,則是有回路。
	int count = 0;
	while (!S.empty()) {
		int top = S.top();
		printf("%c ", g.vertexlist[top].data);
		S.pop();
		count++;
		ArcNode* p = g.vertexlist[top].firstarc;
		for (p; p != NULL; p = p->nextarc) {
			int i = p->adjvex;
			if (--indegree[i] == 0) {
				S.push(i);
			}
		}
	}
	if (count == g.vexnum) {
		return true;
	}
	return false;
}

三、測試結(jié)果

自己花了一個看起來挺復雜的圖,一下也看不出來有沒有環(huán)

首先算一算入度,順帶打印一下。

接下來是拓撲排序的結(jié)果

完美!

總結(jié)

每個頂點進棧一次出戰(zhàn)一次,度減一的操作執(zhí)行了e次,所以整個算法的時間復雜度為O(n+e)。

到此這篇關于C/C++淺析鄰接表拓撲排序算法的實現(xiàn)的文章就介紹到這了,更多相關C++拓撲排序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C++設置超時時間的簡單實現(xiàn)方法

    C++設置超時時間的簡單實現(xiàn)方法

    這篇文章主要介紹了C++設置超時時間的簡單實現(xiàn)方法,涉及系統(tǒng)函數(shù)setsockopt對套接口的操作,具有一定的實用價值,需要的朋友可以參考下
    2014-10-10
  • C語言二維數(shù)組應用之掃雷游戲

    C語言二維數(shù)組應用之掃雷游戲

    這篇文章主要為大家詳細介紹了C語言二維數(shù)組應用之掃雷游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C語言實現(xiàn)鏈隊列基本操作

    C語言實現(xiàn)鏈隊列基本操作

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)鏈隊列基本操作,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • 詳解C++?左值引用與?const?關鍵字

    詳解C++?左值引用與?const?關鍵字

    這篇文章主要介紹了C++?左值引用與?const?關鍵字,左值引用是已定義的變量的別名,其主要用途是用作函數(shù)的形參,將?const?關鍵字用于左值引用時,其在初始化時可接受的賦值形式變得更加廣泛了,這里來總結(jié)一下,需要的朋友可以參考下
    2022-09-09
  • 《C++ primer plus》讀書筆記(二)

    《C++ primer plus》讀書筆記(二)

    本讀書筆記是讀了《C++ primer plus(第六版)》第五至八章的學習筆記。是C++讀書筆記系列的第二篇。復習C++基礎知識的可以瞄瞄。
    2014-10-10
  • C++實現(xiàn)學校人員管理系統(tǒng)

    C++實現(xiàn)學校人員管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C++實現(xiàn)學校人員管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 解析C++編程中的選擇結(jié)構(gòu)和switch語句的用法

    解析C++編程中的選擇結(jié)構(gòu)和switch語句的用法

    這篇文章主要介紹了解析C++編程中的選擇結(jié)構(gòu)和switch語句的用法,是C++入門學習中的基礎知識,需要的朋友可以參考下
    2015-09-09
  • c++讀取excel的代碼詳解

    c++讀取excel的代碼詳解

    在本篇文章里小編給大家分享的是一篇關于c++讀取excel的代碼詳解內(nèi)容,需要的朋友們可以學習參考下。
    2020-02-02
  • Clion-MinGW編譯后的exe文件添加ico圖標的操作方法

    Clion-MinGW編譯后的exe文件添加ico圖標的操作方法

    這篇文章主要介紹了Clion-MinGW編譯后的exe文件添加ico圖標的操作方法,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • C語言進階練習二叉樹的遞歸遍歷

    C語言進階練習二叉樹的遞歸遍歷

    樹是一種重要的非線性數(shù)據(jù)結(jié)構(gòu),直觀地看,它是數(shù)據(jù)元素(在樹中稱為結(jié)點)按分支關系組織起來的結(jié)構(gòu),很象自然界中的樹那樣。樹結(jié)構(gòu)在客觀世界中廣泛存在,如人類社會的族譜和各種社會組織機構(gòu)都可用樹形象表示,本篇介紹二叉樹的遞歸與非遞歸遍歷的方法
    2022-06-06

最新評論