題意:
給各個隊間的勝負關係,讓排名次,名詞相同按從小到大排。
解析:拓撲排序是應用於有向無迴路圖(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...