CF-Educational-25 E-Minimal Labels (拓扑排序,字典序)
来源:互联网 发布:centos下载apache教程 编辑:程序博客网 时间:2024/05/16 06:35
You are given a directed acyclic graph with n vertices and m edges. There are no self-loops or multiple edges between any pair of vertices. Graph can be disconnected.
You should assign labels to all vertices in such a way that:
- Labels form a valid permutation of length n — an integer sequence such that each integer from 1 to n appears exactly once in it.
- If there exists an edge from vertex v to vertex u then labelv should be smaller than labelu.
- Permutation should be lexicographically smallest among all suitable.
Find such sequence of labels to satisfy all the conditions.
The first line contains two integer numbers n, m (2 ≤ n ≤ 105, 1 ≤ m ≤ 105).
Next m lines contain two integer numbers v and u (1 ≤ v, u ≤ n, v ≠ u) — edges of the graph. Edges are directed, graph doesn't contain loops or multiple edges.
Print n numbers — lexicographically smallest correct permutation of labels of vertices.
3 31 21 33 2
1 3 2
4 53 14 12 33 42 4
4 1 2 3
5 43 12 12 34 5
3 1 2 4 5
如图,如果从小到大讨论的话答案是 3 1 2 但显然正解是 2 3 1
附我naive的wa代码
#include<cstdio>#include<iostream>#include<queue>#include<algorithm>#define N 2222222using namespace std;int n,m,d[N],tot,ans[N];int TOT,EN[N],NE[N],LA[N];void ADD(int x,int y){TOT++;EN[TOT]=y;NE[TOT]=LA[x];LA[x]=TOT;}priority_queue<int,vector<int>,greater<int> >q;int main(){int i,j,x,y;cin>>n>>m;for(i=1;i<=m;i++){scanf("%d%d",&x,&y);d[y]++;ADD(x,y);}for(i=1;i<=n;i++)if(d[i]==0)q.push(i);while(!q.empty()){x=q.top();q.pop();ans[x]=++tot;for(i=LA[x];i;i=NE[i]){y=EN[i];if(d[y]>0){d[y]--; if(d[y]==0)q.push(y);}}}for(i=1;i<=n;i++)printf("%d ",ans[i]);}
附ac代码
#include<cstdio>#include<iostream>#include<queue>#include<algorithm>#define N 222222using namespace std;int n,m,d[N],tot,ans[N];int TOT,EN[N],NE[N],LA[N];void ADD(int x,int y){TOT++;EN[TOT]=y;NE[TOT]=LA[x];LA[x]=TOT;}priority_queue<int>q;int main(){int i,j,x,y;cin>>n>>m;for(i=1;i<=m;i++){scanf("%d%d",&x,&y);d[x]++;ADD(y,x);}for(i=1;i<=n;i++)if(d[i]==0)q.push(i);tot=n;while(!q.empty()){x=q.top();q.pop();ans[x]=tot--;for(i=LA[x];i;i=NE[i]){y=EN[i];if(d[y]>0){d[y]--; if(d[y]==0)q.push(y);}}}for(i=1;i<=n;i++)printf("%d ",ans[i]);}
- CF-Educational-25 E-Minimal Labels (拓扑排序,字典序)
- Educational Codeforces Round 25 E. Minimal Labels(拓扑排序)
- Educational Codeforces Round 25E. Minimal Labels(拓扑排序+思维)
- [拓扑序] Educational Codeforces Round 25 825E. Minimal Labels
- cf 825E Minimal Labels 【拓扑】
- Educational Codeforces Round 25 E. Minimal Labels
- Educational Codeforces Round 25 E. Minimal Labels
- CF825E:Minimal Labels(拓扑排序)
- codeforce 825E. Minimal Labels 拓扑排序 贪心思想
- codeforces825E Minimal Labels【拓扑排序】
- Codeforces 825 F Minimal Labels(反向拓扑排序)
- HDU 4857 逃生 && Codeforces 825 E. Minimal Labels 逆向拓扑序+优先队列
- CodeForces 825E Educational #25 E:拓扑排序+优先队列
- codeforces 825 E Minimal Labels
- Codeforces 825E Minimal Labels
- cf Educational Codeforces Round 25 E
- 拓扑排序-字典序
- 拓扑排序(字典序)
- 多种编程语言执行效率的比较
- 2017.07.17回顾
- Docker安装jdk,tomcat配合nginx(windows)实现负载均衡
- 鼠标滚动
- 微信token验证失败
- CF-Educational-25 E-Minimal Labels (拓扑排序,字典序)
- Person Re-identification Overview
- --1 排序与查找 基础算法
- n-queens
- 徽章系列5: Codecov 的使用
- HOGDescriptor with SVM
- 徽章系列6: Api_Level 的使用
- 徽章系列7: codacy 的使用
- windows下使用nvm,以及切换nvm下载源