HDU 4857 逃生(反向拓扑排序+优先队列)
2016-02-17 23:43
344 查看
( ̄▽ ̄)"
//这题对序号输出有要求,较小的序号优先输出,所以用到优先队列 //优先队列是优先弹出值最大的,所以最后要反向输出结果,才是正确的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"); } } }
相关文章推荐
- 华为笔试1 去除重复字符并排序的字符串 c++ string 实现
- HTML中结构化标签的使用
- hdu 1535 Invitation Cards(邻接表spfa)
- POJ 1258 Agri-Net(Prim)
- xampp设置开机启动
- 通过注册的URL Scheme向目标APP传递参数
- AHB 总线问答(转)
- PHP——动态随机数
- 1084. Broken Keyboard (20)
- 阅读 KBEngine 要理清的问题
- 设计模式-iterator 简单模拟ArrayList与LinkList
- 六种常用的设计模式java实现(三)责任链模式
- POJ 1611 The Suspects(简单并查集)
- HDU 1548 A strange lift(dij+邻接矩阵)
- elixir mix 简介
- socket访问百度
- iOS学习----------图片的简单处理(2)
- 消除“Permission is only granted to system apps”错误
- Bootstrap多级导航栏(级联导航)的实现代码
- Xcode6.4注册URL Scheme步骤详解