HDU 4857 逃生(反向拓扑排序+优先队列)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 4857 逃生(反向拓扑排序+优先队列)相关的知识,希望对你有一定的参考价值。
//这题对序号输出有要求,较小的序号优先输出,所以用到优先队列 //优先队列是优先弹出值最大的,所以最后要反向输出结果,才是正确的output #include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #include<cstring> #include<string> #include<cstdlib> #include<vector> #include<queue> using namespace std; typedef long long ll; const int MAXN=100005; vector<int> g[MAXN]; int degree[MAXN],L[MAXN],n,m; void toposort() { int tot=0; priority_queue<int> que; //toposort的实现类似于BFS for(int i=1;i<=n;i++) if(!degree[i]) que.push(i); while(!que.empty()) { int x=que.top();que.pop(); L[tot++]=x; for(int j=0;j<g[x].size();j++) { int t=g[x][j]; degree[t]--; if(!degree[t]) que.push(t); } } // if(tot==n) return true; // return false; } int main() { int t,a,b; scanf("%d",&t); while(t--) { scanf("%d %d",&n,&m); memset(degree,0,sizeof(degree)); memset(L,0,sizeof(L)); memset(g,0,sizeof(g)); for(int i=0;i<m;i++) { scanf("%d %d",&a,&b); g[b].push_back(a); degree[a]++; } toposort(); for(int i=n-1;i>=0;i--) { printf("%d",L[i]); if(i!=0) printf(" "); else printf("\n"); } } }
以上是关于HDU 4857 逃生(反向拓扑排序+优先队列)的主要内容,如果未能解决你的问题,请参考以下文章