之前寫過的部落格,今天回頭看時,發現格式好亂,重新寫一下。
分析首先先處理特殊關係,對於有要求的數字,在他們倆之間建立一條邊,a->b 同時b的入度++,表示b的限制條件增加1.那麼在處理時,用乙個優先佇列按照greater的順序push,(push入度為0)那麼這道題就得到解決了,然後在這道題中是行不通的,因為對於這樣一組資料3 1一共有5個點的情況下,那麼按照上面的方法那麼就會輸出2 3 1,然而這並不符合題意因為題目中要求是1要盡可能上前,因該輸出的是3 1 2,那麼該如何處理這個問題喃?首先應該分析為什麼會出現這個問題,是因為在優先佇列《greater》下因為2的入度為0,所以會先入隊,那麼應該怎麼讓3先入隊?大家都是入隊為0,並且老子還抱著個大腿啊喂!於是就考慮到反向拓撲,然後當然也要反向建圖是不是。優先佇列也要按照less的順序排序,這樣做的結果是5 4 2 1 3然後再反向輸出就gg了,不要忘記重邊的判斷哦。
**
#include#include#include#include#include#include#include#includeusing namespace std;
const int maxn = 3e4+10;
int in[maxn];
int n, m;
stackiron;
vectorvec[maxn];
typedef pairpii;
void ini()
void solve()
while (!que.empty())
}}void show()
printf("%d\n", iron.top());
}int main()
}solve();
show();
} // system("pause");
return 0;
}
hdu4857 反向拓撲排序
折騰了一下午,一開始以為從1.n分別找出反向路徑進行輸出,然後就是正確的姿勢了,提交了一兩把,發現是錯的,比如下面的case 4 3 4 22 1 3 1正解應該是4 2 3 1,而我的是3 4 2 1,後面的2的位置明顯靠後,然後看了想了一下符合反向拓撲排序的規律,所以建邊的時候反著建就可以了。當...
反向拓撲排序 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陣列中得到的就是正確序列。其實可以想得通,因為每次...