拓撲排序之變數序列(三種演算法實現)

2021-08-02 04:58:58 字數 2974 閱讀 2231

/*

name: 拓撲排序之變數序列(三種演算法實現)

author:

date: 17-11-14 21:02

description: 拓撲排序之變數序列

假設有n個變數(1<=n<=26,變數名用單個小寫字母表示),還有m個二元組(u,v),分別表示變數u小於v。

那麼,所有變數從小到大排列起來應該是什麼樣子的呢?

例如有4個變數a,b,c,d,若以知a#include#define true 1

#define false 0

#define maxm 26 //最大變數(頂點)數量

#define maxn 100000 //最大關係式數量

typedef char vertextype; //頂點型別由使用者自定義

typedef int edgetype; //邊上的權值型別由使用者自定義

typedef struct edgenode edgenode;

typedef struct vertexnode vertexnode;

int book[maxm] = ; //標記某字母是否出現

int color[maxm] = ;//儲存頂點的顏色,白色(0)表示未訪問,灰色(1)表示已訪問,黑色(2)表示已完成訪問

int istoposeq(char *data, char *topo);//根據關係列表data,判斷topo字串是否為拓撲序列

int creategraph(char *data, vertexnode *gl);//建立乙個圖

void printgraph(vertexnode *gl);//輸出圖

int topologicalsort_dfs(char *topo, vertexnode *gl, int n);//拓撲排序,獲取拓撲序列,若存在環則返回假

int topologicalsort_bfs(char *topo, vertexnode *gl, int n);//拓撲排序,獲取拓撲序列,若存在環則返回假

int topologicalsort_dfs_color(char *topo, vertexnode *gl, int n);//拓撲排序,獲取拓撲序列,若存在環則返回假

int dfs_color(char *topo, vertexnode *gl, int *top, int u);//使用深度優先搜尋方法構造逆序拓撲序列

int main()

/*函式名稱:creategraph

函式功能:把頂點和邊資訊讀入到表示圖的鄰接表中

輸入變數:char *data:儲存了n個關係式的字串

vertexnode *gl : 頂點表陣列

輸出變數:表示圖的頂點表陣列

返回值:int :頂點數量

*/ int creategraph(char *data, vertexnode *gl)

for (i=0; inext)//將u的鄰接點入度減1,並將入度為0的頂點入棧

printf("\n");

} printf("\n");

} /*

函式名稱:topologicalsort_dfs

函式功能:拓撲排序,採用深度優先搜尋獲取拓撲序列

輸入變數:char *topo:用來儲存拓撲序列的字串

vertexnode *gl : 頂點表陣列

int n:頂點個數

輸出變數:用來儲存拓撲序列的字串

返回值:int :拓撲排序成功返回真,若存在環則返回假

*/ int topologicalsort_dfs(char *topo, vertexnode *gl, int n)

} topo[count] = '\0';

return (count == n);//如果count小於頂點數,說明存在環 }/*

函式名稱:topologicalsort_bfs

函式功能:拓撲排序,採用廣度優先搜尋獲取拓撲序列

輸入變數:char *topo:用來儲存拓撲序列的字串

vertexnode *gl : 頂點表陣列

int n:頂點個數

輸出變數:用來儲存拓撲序列的字串

返回值:int :拓撲排序成功返回真,若存在環則返回假

*/ int topologicalsort_bfs(char *topo, vertexnode *gl, int n)

} topo[rear] = '\0';

return (rear == n);//如果count小於頂點數,說明存在環

}int istoposeq(char *data, char *topo)//根據關係列表data,判斷topo字串是否為拓撲序列

; int i;

for (i=0; topo[i]!='\0'; i++)//讀取變數下標

pos[topo[i]-'a'] = i;

for (i=0; data[i]!='\0'; i+=2)//每次讀取兩個變數

return true;}/*

函式名稱:topologicalsort_dfs

函式功能:拓撲排序,採用深度優先搜尋判斷反向邊演算法獲取拓撲序列

輸入變數:char *topo:用來儲存拓撲序列的字串

vertexnode *gl : 頂點表陣列

int n:頂點個數

輸出變數:用來儲存拓撲序列的字串

返回值:int :拓撲排序成功返回真,若存在環則返回假

*/ int topologicalsort_dfs_color(char *topo, vertexnode *gl, int n)

if (color[e->adjvex] == 0)

}color[u] = 2; //printf("%c)", u+'a');

topo[(*top)++] = u; //加入拓撲序列,注意是逆序

return flag;

}

三種排序演算法及三種變數交換的巨集實現

1 快速排序 include include include define n 100 define swap x,y intpartition int a,int l,int r void quick sort int a,int l,int r intmain int argc,char arg...

三種排序演算法

1.氣泡排序法 2.選擇排序法 3.插入排序法 由小到大的順序 備註 網上筆試題,是參考網上別人的,具體出處找不到了,請諒解。摘抄記錄下來方便日後學習。如果有問題盡請批評指正,希望可以和大神一起交流。氣泡排序的最好的時間複雜度為o n 最壞的時間為 o n 2 演算法的平均時間複雜度為o n 2 選...

三種基本排序演算法

示例陣列 以公升序為例 for int i 0 i arr.length i 輪數 第一次 j下標從0開始,第0位與第1位相比較,當第0位大於第1位時 3 1 進行交換。交換完陣列為 第二次j為1,第1位與第2位比較,3 5,不交換。第三次j為2,第2位與第3位比較,5 2,交換。陣列為 第四次j為...