hdu4857 反向拓撲排序

2021-07-02 22:10:43 字數 1122 閱讀 5672

折騰了一下午,一開始以為從1....n分別找出反向路徑進行輸出,然後就是正確的姿勢了,提交了一兩把,發現是錯的,比如下面的case:

4 3  

4 22 1

3 1正解應該是4 2 3 1, 而我的是3 4 2 1,後面的2的位置明顯靠後,然後看了想了一下符合反向拓撲排序的規律,所以建邊的時候反著建就可以了。

當然輸出也要是逆向的,這個時候借助一下棧就可以了。

#include "stdio.h"

#include "string.h"

#include "math.h"

#include #include #include #include #include #include #include using namespace std;

#define max 100005

#define max(a,b) a > b ? a : b

#define min(a,b) a < b ? a : b

#define abs(a) a < 0 ? a : (-a)

#define mem(a,b) memset(a,b,sizeof(a))

int mod = 1000000007;

double pi = acos(-1.0);

double eps = 1e-6;

typedef structedge;

edge edge[max];

int head[max];

int indree[max];

int knum;

void addedge(int f, int t)

int t, n, m;

void solve()

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

while( !q.empty() )

} bool flag = true;

while( !ans.empty() )

else

printf(" %d",ans.top());

ans.pop();

} printf("\n");

}int main()

} return 0;

}

反向拓撲排序 HDU 4857 逃生

題意 n個結點,m個拓撲關係 a,b 表示a必須排在b前面,在滿足m個拓撲關係關係的前提下使得小的結點盡可能的排在前面。也就是說我們現在要從1號結點開始考慮,如果要排1號結點,根據拓撲關係,首先必須排哪些結點,如果排好了1號結點,則繼續考慮2號結點 3號結點。我們先看兩個例子 存在拓撲關係 5 3 ...

HDU 4857 拓撲排序反向建邊

題意 有n個人,m個優先順序a,b表示a優先於b,並且每個人有個編號,使編號越小的點盡可能在序列前部 不是字典 序 輸出順序。思路 首先想的是正向建邊的拓撲,但隨之寫了一組資料給否定了,然後嘗試反向建邊,發現每次先對序號大的進行 處理,然後送入ans陣列中得到的就是正確序列。其實可以想得通,因為每次...

hdu4857拓撲排序

糟糕的事情發生啦,現在大家都忙著逃命。但是逃命的通道很窄,大家只能排成一行。現在有n個人,從1標號到n。同時有一些奇怪的約束條件,每個都形如 a必須在b之前。同時,社會是不平等的,這些人有的窮有的富。1號最富,2號第二富,以此類推。有錢人就賄賂負責人,所以他們有一些好處。負責人現在可以安排大家排隊的...