您的位置:首页 > 博客中心 > 互联网 >

HDU4857 逃生 【拓扑排序】

时间:2022-04-21 19:57

#include #include #include #define maxn 100002 using namespace std; int head[maxn], indegree[maxn], ans[maxn]; struct Node{ int to, next; } map[maxn]; void topoSort(int n) { priority_queue, greater > Q; int i, u, id = 1; for(i = 1; i <= n; ++i) if(!indegree[i]) Q.push(i); while(!Q.empty()){ ans[id++] = u = Q.top(); Q.pop(); for(i = head[u]; i != -1; i = map[i].next) if(!--indegree[map[i].to]) Q.push(map[i].to); } for(i = 1; i <= n; ++i) if(i != n) printf("%d ", ans[i]); else printf("%d\n", ans[i]); } int main() { int t, n, m, a, b, i; scanf("%d", &t); while(t--){ memset(indegree, 0, sizeof(indegree)); memset(head, -1, sizeof(head)); scanf("%d%d", &n, &m); for(i = 0; i < m; ++i){ scanf("%d%d", &a, &b); map[i].to = b; map[i].next = head[a]; head[a] = i; ++indegree[b]; } topoSort(n); } return 0; }


AC代码:逆序拓扑

#include 
#include 
#include 
#define maxn 100002
using namespace std;

int head[maxn], indegree[maxn], ans[maxn];
struct Node{
    int to, next;
} map[maxn];

void topoSort(int n)
{
    priority_queue Q;
    int i, u, id = 1;
    for(i = 1; i <= n; ++i)
        if(!indegree[i]) Q.push(i);
    while(!Q.empty()){
        ans[id++] = u = Q.top(); Q.pop();
        for(i = head[u]; i != -1; i = map[i].next)
            if(!--indegree[map[i].to]) Q.push(map[i].to);        
    }    
    for(i = n; i >= 1; --i)
        if(i != 1) printf("%d ", ans[i]);
        else printf("%d\n", ans[i]);
}

int main()
{
    int t, n, m, a, b, i;
    scanf("%d", &t);
    while(t--){
        memset(indegree, 0, sizeof(indegree));
        memset(head, -1, sizeof(head));
        scanf("%d%d", &n, &m);
        for(i = 0; i < m; ++i){
            scanf("%d%d", &a, &b);
            map[i].to = a;
            map[i].next = head[b];
            head[b] = i;
            ++indegree[a];
        }
        topoSort(n);
    }
    return 0;
}



HDU4857 逃生 【拓扑排序】,布布扣,bubuko.com

本类排行

今日推荐

热门手游