【拓扑排序】 HDOJ 4857 逃生

来源:互联网 发布:java技术支持维 编辑:程序博客网 时间:2024/05/16 06:59

这道题要件反图,答案反着输出。。。逆拓扑排序。。

#include <iostream>  #include <queue>  #include <stack>  #include <map>  #include <set>  #include <bitset>  #include <cstdio>  #include <algorithm>  #include <cstring>  #include <climits>  #include <cstdlib>#include <cmath>#define maxn 30005#define eps 1e-10#define mod 1000000009#define INF 99999999  #define lowbit(x) (x&(-x))  #define lson o<<1, L, mid  #define rson o<<1 | 1, mid+1, R  typedef long long LL;using namespace std;struct node{int x;bool operator < (const node &a) const {return a.x>x;}}now, tmp;priority_queue<node> q;int in[maxn];vector<int> g[maxn];vector<int> p;int n, m;void init(void){int i;p.clear();memset(in, 0, sizeof in);for(i = 0; i < maxn; i++)g[i].clear();}void read(void){int u, v;scanf("%d%d", &n, &m);while(m--) {scanf("%d%d", &u, &v);g[v].push_back(u);in[u]++;}}void work(void){int d, x, i;for(i = 1; i <= n; i++)if(in[i] == 0)tmp.x = i, q.push(tmp);while(!q.empty()) {now = q.top();q.pop();x = now.x;p.push_back(x);d = g[x].size();for(i = 0; i < d; i++) {in[g[x][i]]--;if(in[g[x][i]] == 0)tmp.x = g[x][i], q.push(tmp);}}d = p.size();printf("%d", p[d-1]);for(i = d-2; i >= 0; i--)printf(" %d", p[i]);printf("\n");}int main(void){int _;while(scanf("%d", &_)!=EOF) {while(_--) {init();read();work();}}return 0;}


0 0