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;
}
目录
相关文章
AtCoder Beginner Contest 216 D - Pair of Balls (思维建图 拓扑排序判断有向图是否有环)
AtCoder Beginner Contest 216 D - Pair of Balls (思维建图 拓扑排序判断有向图是否有环)
127 0
AtCoder Beginner Contest 216 G - 01Sequence (并查集 贪心 树状数组 差分约束)
AtCoder Beginner Contest 216 G - 01Sequence (并查集 贪心 树状数组 差分约束)
157 0
AtCoder Beginner Contest 203(Sponsored by Panasonic) D.Pond(二分+二维前缀和)
AtCoder Beginner Contest 203(Sponsored by Panasonic) D.Pond(二分+二维前缀和)
93 0
|
机器学习/深度学习
AtCoder Beginner Contest 218 F - Blocked Roads (最短路径还原 思维)
AtCoder Beginner Contest 218 F - Blocked Roads (最短路径还原 思维)
101 0
AtCoder Beginner Contest 214 D.Sum of Maximum Weights (思维 并查集)
AtCoder Beginner Contest 214 D.Sum of Maximum Weights (思维 并查集)
120 0
AtCoder Beginner Contest 225 D - Play Train(双向链表 并查集)
AtCoder Beginner Contest 225 D - Play Train(双向链表 并查集)
143 0
codeforces1253——D. Harmonious Graph(并查集)
codeforces1253——D. Harmonious Graph(并查集)
96 0
UCF 2021 Practice F.Balanced Strings (思维 组合数学)
UCF 2021 Practice F.Balanced Strings (思维 组合数学)
108 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掉的:
250 0
AtCoder Beginner Contest 203 Pond(二分+二维前缀和)
|
人工智能 BI
[Atcoder ARC124] XOR Matching 2-小思维 | 暴力
题意: 给出n,两个数列a[1] -> a[n],b[1] -> b[n] 问有多少个x,可以使得在我们任意一种方式排列b[]之后,有a[i] ^ b[i] == x (1 <= i <= n) 思路: 首先我们可以确定所有的答案一定在a[1] ^ b[i] (1 <= i <= n)之内,所以我们只需要将这些个x的解空间单独放到数组c[]里,然后遍历x的解空间c[],将c[i] ^ a[i]的结果记录在d[]里面,然后判断b[],d[]是否完全相同即可,如果完全相同,就可以记录答案,注意最终答案要进行去重
120 0
[Atcoder ARC124] XOR Matching 2-小思维 | 暴力