HDOJ4857【拓扑排序】
来源:互联网 发布:淘宝接单的app都有哪些 编辑:程序博客网 时间:2024/06/05 19:18
首先 CLJ ORZ
这道题做了两次,第一次瞎搞。。。
第二次,好吧,骄傲地说水过。。。
题意:不说了;
思路:
题目默认是小的在前面,那么就是反向建图,每次排序拿大的出来;
第一次做的时候,我记得我的思路是:还是正向建图,然后每次拿小的出来,天真啊,年轻啊,一个例子:1->3->4和5->2,很明显最终的排序,应该是1,5,2,3,4,其实一开始我还看过题解不理解为什么会这样,我还是理解成1,3,4,6,2,但是你得明白小的在前面,你看例子,{1,3,4}和{6,2}是两个独立的集合,2和3,4没有关系,所以3,4在2后面,那么首先就是要6在前面。所以有上面的方法;
code:
#include<stdio.h>#include<iostream>#include<cstdio>#include<queue>#include<stack>#include<cmath>#include<cstring>#include<cstdlib>#include<climits>#include<algorithm>using namespace std;#define ll unsinged long long#define PI acos(-1.0)#define ING 0x7fffffff#define INF 0x3f3f3f3f#define mod 1000000007#define N 301000struct asd{ int to; int next;};asd q[N];int head[N],tol;int vis[N];int d[N];int pre[N];int n,m;int ans[N];int num;void add(int a,int b){ q[tol].to=b; q[tol].next=head[a]; head[a]=tol++; }void tuopu(){ priority_queue<int>que; //默认优先级是从大到小; while(!que.empty()) que.pop(); for(int i=1;i<=n;i++) { if(!d[i]) que.push(i); } num=0; while(!que.empty()) { int u=que.top(); que.pop(); ans[num++]=u; for(int k=head[u];k!=-1;k=q[k].next) { int i=q[k].to; d[i]--; if(!d[i]) que.push(i); } } for(int i=num-1;i>0;i--) { printf("%d ",ans[i]); } printf("%d\n",ans[0]);}int main(){ int t; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); tol=0; memset(head,-1,sizeof(head)); memset(d,0,sizeof(d)); for(int i=0;i<m;i++) { int a,b; scanf("%d%d",&a,&b); d[a]++; add(b,a); } tuopu(); } return 0;}
0 0
- HDOJ4857【拓扑排序】
- <hdoj4857>逃生
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 【拓扑排序】
- 拓扑排序
- 拓扑排序
- ffmpeg加文字水印并控制水印显示时间或显示周期
- 如何做好年终ppt总结报告
- uva111 lcs 但是和顺序是有关的
- mongoDB的知识点
- Git学习记录
- HDOJ4857【拓扑排序】
- 剑指Offer——求1-n的和值
- windows下使用adb工具查看android程序cpu和内存消耗情况
- Java开发使用Excel批量导入数据
- 3653: 谈笑风生
- TreeSet去重字符串
- [C++]广度优先搜索(含C++模板)
- sublime 整合 eslint
- CDN介绍