拓扑排序C++实现+实例解析(详解 兄弟们冲呀呀呀呀呀呀呀)
生活随笔
收集整理的這篇文章主要介紹了
拓扑排序C++实现+实例解析(详解 兄弟们冲呀呀呀呀呀呀呀)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一:引言
既然是一種排序,那么肯定是按照某種規則進行排序,那么這么想的話,先了解基本知識,再來實戰演練
1. AOV網(Activity On Vertex Network)【頂點——表示活動】
是一個——有向無回路的圖
頂點——表示活動
用弧——表示活動間的優先關系的有向圖稱為-頂點表示活動的網
即如果a->b,那么a是b的先決條件
求拓撲序列就是AOV
2.
用鄰接矩陣存儲時 每一列表示這個頂點的入度(有向圖中)
二:上碼
/* 1.AOV網(Activity On Vertex Network)【頂點——表示活動】是一個——有向無回路的圖頂點——表示活動用弧——表示活動間的優先關系的有向圖稱為-頂點表示活動的網即如果a->b,那么a是b的先決條件求拓撲序列就是AOV2.用鄰接矩陣存儲時 每一列表示這個頂點的入度(有向圖中) */ #include<bits/stdc++.h> using namespace std;typedef struct GNode* PtrGraph; typedef struct GNode{int Nv;int Ne;int Date[100][100]; }gnode;int cnt; //統計每個結點的入度 vector<int>v;//存入度的 vector<int>v1;//記錄拓撲序列 //創建圖 void creatrGraph(PtrGraph G){int N,M;cin >> N >> M;G->Nv = N;G->Ne = M;//矩陣初始化for( int i = 0; i < G->Nv; i++ ){for(int j = 0; j < G->Nv; j++ ){G->Date[i][j] = 0;}} //矩陣賦值for(int i = 0; i < G->Ne; i++ ){int a,b;cin >> a >> b;G->Date[a][b] = 1;//有向圖 } } //求取每一列的數據和即為該頂點的入度 void degree(PtrGraph G){for(int j = 0; j < G->Nv; j++ ){cnt = 0;for( int i = 0; i < G->Nv; i++ ){if(G->Date[i][j] == 1)cnt++;}v.push_back(cnt);} } //求拓撲序列void topology( PtrGraph G ){queue<int>q;int count = 0;//用于計算度數為0的結點的個數 for( int i = 0; i < G->Nv; i++ ){if(v[i] == 0)q.push(i);//將入度為0的入隊 } //這里就是處理每次去掉一個度數為0的點和其有關系的頂點度數減一 while( !q.empty() ){int temp = q.front();q.pop();v1.push_back(temp); count++;for( int j = 0; j < G->Nv; j++ ){//列 if( G->Date[temp][j] == 1 ){//在 temp 這一行中 等于 1的 j 需要入度減一 v[j]--;//其入度減一if( v[j] == 0 ){q.push(j);// 將入度為0的入度 }}}} if( G->Nv == count ){//沒有環 for( int i = 0; i < v1.size(); i++ )cout << v1[i] << ' '; }else{cout << "此圖有環"; } } int main(){PtrGraph G = (PtrGraph)malloc(sizeof(struct GNode));creatrGraph(G);degree(G);topology(G);} //5 6 //0 1 //0 2 //1 3 //2 1 //2 4 //3 4 //拓撲序列為:0 2 1 3 4
加油boy 沖呀
總結
以上是生活随笔為你收集整理的拓扑排序C++实现+实例解析(详解 兄弟们冲呀呀呀呀呀呀呀)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java中的线程不安全和实例解析
- 下一篇: 《诺亚传说》迷宫宝库玩法攻略