HDU 4857 逃生 && Codeforces 825 E. Minimal Labels 逆向拓扑序+优先队列
来源:互联网 发布:php gzip 解压缩 编辑:程序博客网 时间:2024/05/21 13:21
传送门:HDU4857
思路:很容易看出来是个拓扑序,然而我用队列、优先队列、排序等等什么方法求拓扑序都wa。。
正解:应该反向建图,由在后面的指向在前面的,这样每次取出来的一定是可以放在最后面的,如果同时有多个入度为0,则取编号较大的,这一过程可以用优先队列维护。(注意,将编号最小的尽量放在前面和字典序最小不一样!见下面样例)
虽然证明不了这样是反着做是对的,但是很简单一组数据就能证明正向做不可行:
1
3 2
3 1
3 1
答案应为3 1 2
代码:
#include<bits/stdc++.h>#include<iostream>#include<vector>#include<queue>using namespace std;#define MAXN 100010vector<int>g[MAXN],ans;int n,m,k=1;int in[MAXN];priority_queue<int>q;void topo_sort(){ while(!q.empty())q.pop(); int s,u,v; for(int i=1;i<=n;i++) if(in[i]==0) { q.push(i); } while(!q.empty()) { u=q.top();q.pop(); ans.push_back(u); for(int i=0;i<g[u].size();i++) { v=g[u][i]; in[v]--; if(in[v]==0) q.push(v); } }}int main(){ int T,u,v; cin>>T; while(T--) { k=1; ans.clear(); memset(in,0,sizeof(in)); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) g[i].clear(); for(int i=0;i<m;i++) { scanf("%d%d",&u,&v); g[v].push_back(u); in[u]++; } topo_sort(); for(int i=n-1;i>=0;i--) printf("%d%c",ans[i]," \n"[i==0]); }}
好好琢磨琢磨似乎有那么点意思。
传送门:E. Minimal Labels
题意:给出一个DAG图,让你给每个顶点标号,标号的条件:
1. 如果有一条边(u,v),则lable[u]<lable[v]
2. 满足上面条件的情况下使得字典序最小。
这题与上面那题的思路和做法都是一样的,但为什么问题不一样呢?我个人认为是因为上面的题让输出的是拓扑排序后的序列,而这个题输出的是拓扑排序后序列中每个元素的标号,也就是说上面的题中如果把每个元素的标号按顺序输出来也是字典序最小的。
代码:
#include<bits/stdc++.h> #include<iostream> #include<vector> #include<queue> using namespace std; #define MAXN 100010 vector<int>g[MAXN],ans(MAXN); int n,m,k=1; int in[MAXN]; priority_queue<int,vector<int>,less<int> >q; void topo_sort() { while(!q.empty())q.pop(); int s,u,v; for(int i=1;i<=n;i++) if(in[i]==0) { q.push(i); } while(!q.empty()) { u=q.top();q.pop(); ans[u]=k--; //注意这里是u点的标号为k for(int i=0;i<g[u].size();i++) { v=g[u][i]; in[v]--; if(in[v]==0) q.push(v); } } } int main() { int T,u,v; ans.clear(); memset(in,0,sizeof(in)); scanf("%d%d",&n,&m); k=n; for(int i=0;i<m;i++) { scanf("%d%d",&u,&v); g[v].push_back(u); in[u]++; } topo_sort(); for(int i=1;i<=n;i++) printf("%d%c",ans[i]," \n"[i==n]);}
阅读全文
0 0
- HDU 4857 逃生 && Codeforces 825 E. Minimal Labels 逆向拓扑序+优先队列
- hdu 4857 逃生(逆向拓扑+优先队列)
- [拓扑序] Educational Codeforces Round 25 825E. Minimal Labels
- hdu 4857 逃生 拓扑排序+优先队列,逆向处理
- HDU 4857 逃生 (逆向拓扑排序、优先队列)
- codeforces 825 E Minimal Labels
- Codeforces 825E Minimal Labels
- HDU 4857 逃生 拓扑排序+优先队列
- HDU 4857 逃生 【逆拓扑 优先队列】
- cf 825E Minimal Labels 【拓扑】
- hdoj 4857 逃生(逆向拓扑排序+优先队列)
- 杭电-4857逃生(反向拓扑+优先队列+逆向输出)
- HDU4857 逃生【逆向拓扑排序】【优先队列】
- Educational Codeforces Round 25 E. Minimal Labels(拓扑排序)
- Educational Codeforces Round 25E. Minimal Labels(拓扑排序+思维)
- hdu 4857 逃生(优先队列+逆拓扑排序)
- HDU 4857 逃生 【拓扑排序+反向建图+优先队列】
- HDU 4857 逃生 (反向拓扑排序+优先队列)
- linux根文件系统
- Spring 延迟加载
- SpringMVC DispatcherServlet重写、自定义拦截器拦截器(一)
- 谈一谈自己对依赖、关联、聚合和组合之间区别的理解
- Android平台Camera实时滤镜实现方法探讨(三)--通过Shader实现YUV转换RBG
- HDU 4857 逃生 && Codeforces 825 E. Minimal Labels 逆向拓扑序+优先队列
- FUNDAMENTAL Unit03 运算符和表达式 、 分支结构
- 深入探究connect函数
- 共性问题
- 迈出从3K到1W的重要一步——掌握设计模式
- Struts2 Validation验证框架错误提示信息的显示位置
- BZOJ 1003 [ZJOI2006] 物流运输
- MySQL 数据类型
- bzoj 2761 [JLOI2011]不重复数字