hdu 1285 (簡單的拓撲排序)

2021-08-19 17:02:45 字數 1871 閱讀 7753

題意:給出一些隊伍之間的勝負關係,讓你輸出排名的先後順序,如果排名相同則字典序小的先輸出。

思路:這是一道裸的拓撲排序的題目。主要用來測一下板子。

下面給出幾種不同的版本

判斷的第一種方法:我們可以知道當前入度為0的節點一定是根節點,這時我們只要將其輸出,並且拆除所有與根節點相連的邊就行了(拆的時候別忘了同時更新節點的入度值)。

用鄰接矩陣儲存的

#include 

#include

#include

using

namespace

std;

const

int maxn = 505;

int g[maxn][maxn];//儲存資料

int n, m, a, b;

int into[maxn];//儲存入度

void toposort()

}if(ans < n) printf("%d ", k);

else

if(ans == n) printf("%d\n", k);

for(int j = 1; j <= n; j++) }}

}int main()

}toposort();

}return

0;}

結構體(前向星)儲存的

#include 

#include

#include

#include

#include

using

namespace

std;

const

int maxn = 505;

int n, m, u, v;

struct node edge[maxn];

int head[maxn], into[maxn];

void toposort()

while(!q.empty())

}}int main()

}if(flag)

}toposort();

}return

0;}

用vector儲存的

#include 

#include

#include

#include

#include

#include

using

namespace

std;

const

int maxn = 505;

int n, m, u, v;

int head[maxn], into[maxn];

vector

g[maxn];

vector

::iterator it;

void toposort()

while(!q.empty())

}}int main()

toposort();

}return

0;}

附:拓撲排序dfs版(不是本題**)

int c[maxn];

int g[maxn][maxn];

int n, m, max;

int topo[maxn];

bool dfs(int u)

c[u] = 1;

topo[max--] = u;

return1;}

bool toposort()

// for(int i = 1; i <= n; i++) printf("%d ", topo[i]);

return

1;}

hdu1285(拓撲排序)

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

hdu 1285(拓撲排序)

題意 給各個隊間的勝負關係,讓排名次,名詞相同按從小到大排。解析 拓撲排序是應用於有向無迴路圖 direct acyclic graph,簡稱dag 上的一種排序方式,對乙個有向無迴路圖進行拓撲排序後,所有的頂點形成乙個序列,對所有邊 u,v 滿足u 在v 的前面。該序列說明了頂點表示的事件或狀態發...

HDU1285 拓撲排序

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