2015-2016 ACM-ICPC, NEERC, Moscow Subregional Contest(K. King's Rout)(拓扑排序)

来源:互联网 发布:淘宝销售量怎么算 编辑:程序博客网 时间:2024/04/29 05:58

King's Rout

题目链接:

http://codeforces.com/gym/100792/problem/K

解题思路:

将顺序反过来,然后再求拓扑排序。注意:最后将结果倒着输出。

AC代码:

#include <bits/stdc++.h>using namespace std;const int N = 200005;int n,m;int indegree[N];priority_queue<int> q;vector<int> v[N];vector<int> ans;void solve(int cur){    int len = v[cur].size();    for(int i = 0; i < len; ++i){        int tmp = v[cur][i];        --indegree[tmp];        if(!indegree[tmp])            q.push(tmp);    }}int main(){    while(~scanf("%d%d",&n,&m)){        for(int i = 0; i <= n; ++i)            v[i].clear();        ans.clear();        while(!q.empty())            q.pop();        memset(indegree,0,sizeof(indegree));        int a,b;        for(int i = 0; i < m; ++i){            scanf("%d%d",&a,&b);            ++indegree[a];            v[b].push_back(a);        }        for(int i = 1; i <= n; ++i)            if(indegree[i] == 0)                q.push(i);        while(!q.empty()){            int cur = q.top();            ans.push_back(cur);            q.pop();            solve(cur);        }        for(int i = n-1; i > 0; --i)            printf("%d ",ans[i]);// 最后倒着输出。        printf("%d\n",ans[0]);    }    return 0;}


0 0
原创粉丝点击