hdu 1285(拓撲排序)

2021-06-28 16:10:00 字數 1668 閱讀 6433

題意:

給各個隊間的勝負關係,讓排名次,名詞相同按從小到大排。

解析:拓撲排序是應用於有向無迴路圖(direct acyclic graph,簡稱dag)上的一種排序方式,對乙個有向無迴路圖進行拓撲排序後,所有的頂點形成乙個序列,對所有邊(u,v),滿足u

在v 的前面。該序列說明了頂點表示的事件或狀態發生的整體順序。比較經典的是在工程活動上,某些工程完成後,另一些工程才能繼續,此時可以以工程為頂點,工程間的依賴關係為邊建立圖,用拓撲排序求得所有工程的合理執行順序。

對乙個dag 進行拓撲排序有兩種方法,分別利用廣度優先搜尋與深度優先搜尋。

首先介紹頂點的度,乙個頂點的度指與該點相連的邊的數量,對於有向圖,乙個頂點的度分為入度與出度,入度為指向該頂點的邊的數量,出度即從該點出發的邊的數量。

使用廣度搜尋:進行拓撲排序時,每次可以拿出的頂點一定是入度為0 的點,即沒有被指向的點,因為這樣的點表示的事件沒有依賴,在乙個入度為0 的點表示的事件執行完之後,它所指向的頂點所依賴的點就少了乙個,所以我們可以先將所有入度為0 的點加入乙個佇列中,然後依次將它們所指向的點的入度減1,再將入度變為0 的點也依次加入列,這樣最後就可以得到乙個拓撲有序的序列。

使用深度搜尋:在對乙個dag 進行深度優先搜尋時,對於圖上的一條邊u,v,一定有v 比u 更早退出dfs 過程,而拓撲排序的順序正好相反,對於一條邊u,v,需要u 排在v

前面,所以可以利用dfs,將所有的點按照退出dfs 的過程倒序排列,即得到乙個圖的拓撲序。

struct arc

;arc arc[50005];

int node[5005];

int digree[5005];

int top[5005];

int main()

for(int i=1; i<=n; i++)

}int l=0;

while(!q.empty())}}

return 0;

}

這題加個優先佇列來解決結點大小問題。

**:

#include #include #include #include #include #include #include #include #include #include #include #include #define ll long long

using namespace std;

const int maxn = 500 + 5;

const int inf = 0x3f3f3f3f;

const double eps = 1e-8;

const double pi = 4 * atan(1.0);

const double ee = exp(1.0);

int g[maxn][maxn];

int digree[maxn];

int ans[maxn], index;

int n, m;

void toposort()

}while (!q.empty())}}

}}int main()

}toposort();

for (int i = 0; i < index - 1; i++)

printf("%d\n", ans[index - 1]);

}return 0;

}

hdu1285(拓撲排序)

拓撲排序簡單來說就是把乙個圖的所有節點排序,使得每一條有向邊 u,v 對應的u都排在v的前面。拓撲排序最大的用途就是判斷乙個有向圖是否有環,當然判斷還有一種方法就是floyd演算法。如果用鄰接表的話拓撲排序的時間複雜度是o n e 鄰接矩陣是o n 2 n表示頂點數,e表示邊數,floyd時間複雜度...

HDU1285 拓撲排序

拓撲排序的水題,題意是確定比賽的名次,每一次將輸的人的入度加一,然後就是拓撲排序的模板套路了,記住輸入的時候可能有重邊,貼 include include include include using namespace std int map 600 600 head 600 hash 600 in...

hdu 1285 拓撲排序

題意 中文題 比較裸的拓撲排序,就是題目中要求編號小的隊伍應該在前面,所以用乙個優先佇列,讓小的先出隊。優先佇列從小到大的寫法是 priority queue,greater q 用vector來儲存,這樣的話不需要進行判重 include include include include inclu...