拓撲排序

1.什麼是拓撲排序node

  拓撲排序就是對有向無環圖(DAG)上的一些點的編號進行排序,使得圖中每條邊的起點都比終點的位置要靠前c++

前置知識:度

一個點連着的邊的數量,稱爲該點的度。其中由該點出發的稱爲出度,到達該點的稱爲入度。算法

2.如何實現spa

  算法過程:3d

 

  1. 先統計全部點的入度,分離出入度爲0的點,將其存到答案隊列中,而後將這個點有邊指向的全部的點的入度都減一
  2. 重複上述操做,直到沒有點入度爲零
  3. 若是還有點入度不爲零,就說明有環,則問題無解

 

好比這個圖code

咱們發現點1入度爲0,因此分離點1,並對其餘點的入度進行調整blog

此時咱們發現點2和4入度爲0,那麼咱們先分離點2,調整入度排序

繼續分離隊列

                      

 

 有環的狀況:it

 

 

咱們發現不管如何都沒有點的入度爲1,此時拓撲序無解

 

代碼:

#include<bits/stdc++.h>
using namespace std;

const int MAXN=9999999;

int head[MAXN],to[MAXN],nxt[MAXN],in[MAXN],cnt;
int ans[MAXN],nodecnt;

inline void add(int u,int v) 
{
    cnt++;
    to[cnt]=v;
    nxt[cnt]=head[u];
    head[u]=cnt;
}

int n,m;

int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        int start,end;
        scanf("%d%d",&start,&end);
        add(start,end);
        in[end]++;
    }
    priority_queue<int,vector<int>,greater<int> > q;
    for(int i=1;i<=n;i++)
    {
        if(!in[i]) q.push(i);
    }
    while(!q.empty())
    {
        int top=q.top();
        q.pop();
        ans[++nodecnt]=top;
        for(int e=head[top];e;e=nxt[e])
        {
            in[to[e]]--;
            if(!in[to[e]]) q.push(to[e]);
        }
    }
    if(nodecnt!=n) printf("No Solution");
    else 
    {
        for(int i=1;i<=nodecnt;i++)
        {
            printf("%d ",ans[i]);
        }
    }
    
}
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息