拓扑排序C++实现+实例解析(详解 兄弟们冲呀呀呀呀呀呀呀)
生活随笔
收集整理的這篇文章主要介紹了
拓扑排序C++实现+实例解析(详解 兄弟们冲呀呀呀呀呀呀呀)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一:引言
既然是一種排序,那么肯定是按照某種規(guī)則進(jìn)行排序,那么這么想的話,先了解基本知識(shí),再來實(shí)戰(zhàn)演練
1. AOV網(wǎng)(Activity On Vertex Network)【頂點(diǎn)——表示活動(dòng)】
是一個(gè)——有向無回路的圖
頂點(diǎn)——表示活動(dòng)
用弧——表示活動(dòng)間的優(yōu)先關(guān)系的有向圖稱為-頂點(diǎn)表示活動(dòng)的網(wǎng)
即如果a->b,那么a是b的先決條件
求拓?fù)湫蛄芯褪茿OV
2.
用鄰接矩陣存儲(chǔ)時(shí) 每一列表示這個(gè)頂點(diǎn)的入度(有向圖中)
二:上碼
/* 1.AOV網(wǎng)(Activity On Vertex Network)【頂點(diǎn)——表示活動(dòng)】是一個(gè)——有向無回路的圖頂點(diǎn)——表示活動(dòng)用弧——表示活動(dòng)間的優(yōu)先關(guān)系的有向圖稱為-頂點(diǎn)表示活動(dòng)的網(wǎng)即如果a->b,那么a是b的先決條件求拓?fù)湫蛄芯褪茿OV2.用鄰接矩陣存儲(chǔ)時(shí) 每一列表示這個(gè)頂點(diǎn)的入度(有向圖中) */ #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; //統(tǒng)計(jì)每個(gè)結(jié)點(diǎn)的入度 vector<int>v;//存入度的 vector<int>v1;//記錄拓?fù)湫蛄?//創(chuàng)建圖 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;//有向圖 } } //求取每一列的數(shù)據(jù)和即為該頂點(diǎn)的入度 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);} } //求拓?fù)湫蛄?/span>void topology( PtrGraph G ){queue<int>q;int count = 0;//用于計(jì)算度數(shù)為0的結(jié)點(diǎn)的個(gè)數(shù) for( int i = 0; i < G->Nv; i++ ){if(v[i] == 0)q.push(i);//將入度為0的入隊(duì) } //這里就是處理每次去掉一個(gè)度數(shù)為0的點(diǎn)和其有關(guān)系的頂點(diǎn)度數(shù)減一 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 ){//沒有環(huán) for( int i = 0; i < v1.size(); i++ )cout << v1[i] << ' '; }else{cout << "此圖有環(huán)"; } } 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 //拓?fù)湫蛄袨?#xff1a;0 2 1 3 4
加油boy 沖呀
總結(jié)
以上是生活随笔為你收集整理的拓扑排序C++实现+实例解析(详解 兄弟们冲呀呀呀呀呀呀呀)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java中的线程不安全和实例解析
- 下一篇: MVC三层架构(详解)