HDU Problem 4857 逃生【拓扑排序+优先队列】
生活随笔
收集整理的這篇文章主要介紹了
HDU Problem 4857 逃生【拓扑排序+优先队列】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?
逃生
Time Limit: 2000/1000 MS (Java/Others)????Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4265????Accepted Submission(s): 1185
現在有n個人,從1標號到n。同時有一些奇怪的約束條件,每個都形如:a必須在b之前。
同時,社會是不平等的,這些人有的窮有的富。1號最富,2號第二富,以此類推。有錢人就賄賂負責人,所以他們有一些好處。
負責人現在可以安排大家排隊的順序,由于收了好處,所以他要讓1號盡量靠前,如果此時還有多種情況,就再讓2號盡量靠前,如果還有多種情況,就讓3號盡量靠前,以此類推。
那么你就要安排大家的順序。我們保證一定有解。
?
Input 第一行一個整數T(1 <= T <= 5),表示測試數據的個數。然后對于每個測試數據,第一行有兩個整數n(1 <= n <= 30000)和m(1 <= m <= 100000),分別表示人數和約束的個數。
然后m行,每行兩個整數a和b,表示有一個約束a號必須在b號之前。a和b必然不同。
?
Output 對每個測試數據,輸出一行排隊的順序,用空格隔開。?
Sample Input 1 5 10 3 5 1 4 2 5 1 2 3 4 1 4 2 3 1 5 3 5 1 2?
Sample Output 1 2 3 4 5?
Author CLJ priority_queue有三個參數,如果最后兩個缺省,默認按照大頂堆的方式平排,將最大的元素拿到對頭。每次從最大元素開始取。如果有特殊安排,只有當小的元素被取出后大元素的度數變為零才可以進隊列后排在對頭出隊列。 #include <cstdio> #include <cstring> #include <queue> #define MAXN 100002 using namespace std; int head[MAXN], indegree[MAXN], ans[MAXN]; struct node{int to, next; }edge[MAXN]; int t, n, m, a, b; void solved() {//大頂堆排序priority_queue<int> que;int u, id = 1;for(int i = 1; i <= n; i++)if(!indegree[i]) que.push(i);while(!que.empty()){ans[id++] = u = que.top(); que.pop();for(int i = head[u]; i != -1; i = edge[i].next) {if(!--indegree[edge[i].to])que.push(edge[i].to);}}for(int i = n; i >= 1; i--) {if(i != 1) printf("%d ", ans[i]);else printf("%d\n", ans[i]);} } int main() {scanf("%d", &t);while (t--) {memset(indegree, 0, sizeof(indegree));memset(head, -1, sizeof(head));scanf("%d%d", &n, &m);for(int i = 0; i < m; i++){scanf("%d%d", &a, &b);edge[i].to = a; edge[i].next = head[b];head[b] = i; indegree[a]++;}solved();}return 0; }?
?
轉載于:https://www.cnblogs.com/cniwoq/p/6770857.html
總結
以上是生活随笔為你收集整理的HDU Problem 4857 逃生【拓扑排序+优先队列】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle发送邮件存储过程
- 下一篇: (转)在MAC上查找和设置$JAVA_H