拓撲排序 bfs實現
阿新 • • 發佈:2018-12-24
程式碼如下:
#include <cstdio> #include <cstring> #include <algorithm> #include <iostream> #include <vector> #include <queue> using namespace std; const int maxn=505; vector <int>ve[maxn]; //儲存出度的節點 int inde[maxn]; //入度的數目 bool vis[maxn]; //是否刪除此節點 vector <int> re; //儲存結果 int n,m; //初始化 void init() { memset (inde,0,sizeof(inde)); for (int i=0;i<maxn;i++) { ve[i].clear(); vis[i]=false; } re.clear(); } //廣度優先搜尋 void bfs (int x) { queue <int> q; q.push(x); vis[x]=true; while (!q.empty()) { int now=q.front(); q.pop(); //將結果放入容器中 re.push_back(now); //通過刪除此點,檢查是否還有0入度的點 for (int i=0;i<ve[now].size();i++) { int v=ve[now][i]; inde[v]--; //如果有,加入佇列 if(!vis[v]&&inde[v]==0) { vis[v]=1; q.push(v); } } } } //拓撲排序 void topsort () { for (int i=1;i<=n;i++) { if(!vis[i]&&inde[i]==0) { bfs(i); } } printf("結果為\n"); for (int i=0;i<re.size();i++) printf("%d%c",re[i],i==re.size()-1? '\n':' '); } int main() { scanf("%d%d",&n,&m); init(); for (int i=0;i<m;i++) { int x,y; scanf("%d%d",&x,&y); ve[x].push_back(y); inde[y]++; } topsort(); return 0; } /*執行結果: 6 11 5 3 5 3 5 1 5 4 5 2 3 1 3 2 6 4 6 2 4 2 4 2 結果為 5 3 1 6 4 2 */