AtCoder Beginner Contest 223 D - Restricted Permutation(建图 思维 构造 拓扑排序)

简介: AtCoder Beginner Contest 223 D - Restricted Permutation(建图 思维 构造 拓扑排序)

linkkk

题意:

给出m组限制条件,要求构造一个长度为n的字典序最小的序列。每组a , b表示在序列里a在b前面。

思路:

建图:a − > b有向边,跑一个拓扑排序,将队列换为优先队列,表示每次将最小的弹出,就能保证字典序最小了。

代码:

// Problem: D - Restricted Permutation
// Contest: AtCoder - AtCoder Beginner Contest 223
// URL: https://atcoder.jp/contests/abc223/tasks/abc223_d
// Memory Limit: 1024 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)
#include<iostream>
#include<cstdio> 
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<sstream>
using namespace std;
typedef long long ll;
const int maxn=2e5+100;
int n,m,din[maxn];
vector<int>g[maxn],ans;
priority_queue<int,vector<int>,greater<int> >q;
int main() {
  cin>>n>>m;
  for(int i=1;i<=m;i++){
    int u,v;
    cin>>u>>v;
    g[u].push_back(v);
    g[v].push_back(u);
    din[v]++;
  }
  for(int i=1;i<=n;i++)
    if(!din[i]){
      q.push(i);
    }
  while(!q.empty()){
    int t=q.top();q.pop();
    ans.push_back(t);
    for(auto tt:g[t]){
      if(--din[tt]==0) q.push(tt);
    }
  }
  bool flag=0;
  for(int i=1;i<=n;i++)
    if(din[i]>0) flag=1;
  if(flag){
    puts("-1");return 0;
  }
  for(auto it:ans) cout<<it<<" ";
  return 0;
}
目录
相关文章
|
8月前
|
算法
The kth great number(小根堆思想,模板题)
The kth great number(小根堆思想,模板题)
23 0
The kth great number(小根堆思想,模板题)
AtCoder Beginner Contest 216 D - Pair of Balls (思维建图 拓扑排序判断有向图是否有环)
AtCoder Beginner Contest 216 D - Pair of Balls (思维建图 拓扑排序判断有向图是否有环)
89 0
AtCoder Beginner Contest 216 G - 01Sequence (并查集 贪心 树状数组 差分约束)
AtCoder Beginner Contest 216 G - 01Sequence (并查集 贪心 树状数组 差分约束)
105 0
AtCoder Beginner Contest 203(Sponsored by Panasonic) D.Pond(二分+二维前缀和)
AtCoder Beginner Contest 203(Sponsored by Panasonic) D.Pond(二分+二维前缀和)
65 0
AtCoder Beginner Contest 221 E - LEQ(组合数学 树状数组)
AtCoder Beginner Contest 221 E - LEQ(组合数学 树状数组)
131 0
codeforces1253——D. Harmonious Graph(并查集)
codeforces1253——D. Harmonious Graph(并查集)
67 0
AtCoder Beginner Contest 214 D.Sum of Maximum Weights (思维 并查集)
AtCoder Beginner Contest 214 D.Sum of Maximum Weights (思维 并查集)
89 0
AtCoder Beginner Contest 226 E - Just one(dfs求连通块 组合数学)
AtCoder Beginner Contest 226 E - Just one(dfs求连通块 组合数学)
80 0
|
机器学习/深度学习
AtCoder Beginner Contest 218 F - Blocked Roads (最短路径还原 思维)
AtCoder Beginner Contest 218 F - Blocked Roads (最短路径还原 思维)
79 0
AtCoder Beginner Contest 203 Pond(二分+二维前缀和)
大体思路: 二分,将原矩阵根据二分的值变成01矩阵,如果元素值> val 就变为1,否则0 对于k * k 的矩阵,统计区域内元素之和,如果 sum < ⌊k2 / 2⌋ + 1,意味着当前k * k矩阵的中位数小于x,而x是我们的答案(最小中位数), ①sum < ⌊k2 / 2⌋ + 1 情况下x取得太大,r = mid ②反之,x还可能取更小的,l = mid 但是需要注意下l的初始值,当取0 or 1的时候是会wa掉的:
208 0
AtCoder Beginner Contest 203 Pond(二分+二维前缀和)