1. 程式人生 > >拓撲排序(程式碼理解)

拓撲排序(程式碼理解)

把程式碼段看完應該就可以了,網上的也挺多的;
我的程式碼已經夠容易理解的了;

#include <iostream>
#include <queue>
#include<cstdio>
#include <cstring>
using namespace std;
queue<int> q;
const int E=100;//E為最大邊數
const int N=100;//n為最大定點數
struct Edge {
    int u; //起點 
    int v; //終點 
    int next;//上一條邊在edge陣列中的位置 
} edge[E];//圖 int head[N];//記錄輸入的最後一個起始節點在edge陣列中的位置 int num;//陣列下標; int indegree[N]; int n, m; void init() { memset(head, 0, sizeof(head));//所有節點的初始為0,一開始節點沒有與之相連的邊 num=1;//陣列下表從1開始 memset(indegree, -1, sizeof(indegree)); } void add_edge(int from,int to) { edge[num].u = from;//起點 edge[num].v = to;//終點
edge[num].next=head[from];//記錄以from節點出發的上一條邊在edge陣列的位置 head[from]=num; //更新以from節點出發的在edge陣列的位置 num++; //陣列下標+1 indegree[to]++; } bool TopologicalSort(int indegree[]) { int i,k; for(i=0;i<n;i++) { if(indegree[i] == -1)//如果入度為-1,那麼入隊 { q.push(i); } } int
count = 0; while(!q.empty()) { k = q.front(); q.pop(); cout<<k<<"-->"; count++;//記錄個數 for(int i = head[k];i != 0;i = edge[i].next) { indegree[edge[i].v]--;//刪除入度 if(indegree[edge[i].v] == -1){ q.push(edge[i].v); } } } if(count<n)//如果個數小於總數,那麼有迴路 return false; return true; } int main() { int a,b; init(); scanf("%d %d",&m, &n); //m為邊數,n為定點數,預設從1開始 for(int i=1;i<=m;i++) { scanf("%d %d",&a,&b); //a是起點,b是終點 add_edge(a,b);//儲存資訊 } if(TopologicalSort(indegree)) cout<<"正常完成!"<<endl; else cout<<"該有向圖有迴路!"<<endl; return 0; } /*測試資料 11 7 0 1 0 2 0 3 1 2 1 4 2 4 2 5 3 5 4 6 5 4 5 6 測試資料2 7 5 0 2 0 3 1 2 1 3 2 4 3 2 3 4 */