首页 > 其他分享 >Codeforces 1765H 题解

Codeforces 1765H 题解

时间:2023-10-02 11:44:33浏览次数:34  
标签:题目 int 题解 拓扑 Codeforces 入队 ans 1765H

题目大意

题目大意

给定一个 \(n\) 个点和 \(m\) 条边的有向图,并给定 \(p_1, p_2, \cdots, p_n\) 表示第 \(i\) 个点的拓扑序必须小于等于 \(p_i\),求出每个点的最小拓扑序。

题解

题解

题目要求拓扑序尽量小,转换一下就是在反图上拓扑序尽量大。考虑拓扑排序,当一个点不得不入队时,才将它入队,这显然是最优的。

考虑不得不入队的点的情况:

  1. 再不入队,其他人无法满足 \(p_i\) 的 要求。
  2. 不入队,后面的点无法进队。

于是用堆模拟这一过程即可。

code:

#include <bits/stdc++.h>

using namespace std;

const int N = 2e3 + 5;
int in[N], n, m, p[N]; vector <int> G[N];
vector <int> ans;

int topo(int x) {
  priority_queue <pair <int, int> > q;
  for (int i = 1; i <= n; ++i) in[i] = 0;
  for (int i = 1; i <= n; ++i) for (auto j : G[i])
    ++in[j];
  for (int i = 1; i <= n; ++i) if (!in[i]) q.emplace(make_pair(p[i], i));
  int now = n;
  while (!q.empty()) {
    int u = q.top().second, P = q.top().first; q.pop();
    if (P < now || u == x) continue;
    ans[now--] = u;
    for (auto v : G[u])
      if (!--in[v]) q.emplace(make_pair(p[v], v));
  } return now;
}

signed main(void) {
  ios :: sync_with_stdio(false);
  cin.tie(nullptr); cout.tie(nullptr);
  cin >> n >> m; ans.assign(n + 1, 0);
  for (int i = 1; i <= n; ++i) cin >> p[i];
  for (int i = 1; i <= m; ++i) {
    int u, v; cin >> u >> v;
    G[v].emplace_back(u);
  }
  for (int i = 1; i <= n; ++i) cout << topo(i) << ' ';
}

标签:题目,int,题解,拓扑,Codeforces,入队,ans,1765H
From: https://www.cnblogs.com/CTHOOH/p/17739821.html

相关文章

  • UVA10054 The Necklace 题解
    好可恶一道题,怎么没人告诉我输出之间有空行(思路是先抽象成图,然后跑一边dfs记录边的前后顺序。对于不能成环的情况,只需要再开个数组记录度数判断奇点即可。若存在奇点则break掉,剩下的跑dfs、//producedbymiya555//stupidmistakes:1.多测要清空2.输出之间有空行//ideas:d......
  • 题解 hdu 1269 迷宫城堡
    找点图论练习题写,发现hdu又寄了,那就发到blog里吧。思路:tarjan缩点判断DAG中点数是否为1。若是,则该图为强连通图。 //producedbymiya555//stupidmistakes:多测记得清空//ideas:tarjan模板#include<bits/stdc++.h>usingnamespacestd;constintN=10010;intn,m,low[......
  • 题解 小 a 和 uim 之大逃离
    题目链接首先可以想到设状态\(k_1,k_2\)表示小\(a\)和小\(uim\)分别表示他们目前取得的得分,那么最终的答案便是\(k_1=k_2\)的时候。但是这样设置状态的复杂度无疑是高的。并且十分浪费,所以考虑设\(z\)表示\(k_1-k_2\)的值。那么\(z=0\)就是答案。接着考虑如何处......
  • SP9494 ZSUM - Just Add It 题解
    题目传送门前置知识快速幂解法推式子:\(\begin{aligned}Z_n+Z_{n-1}-2Z_{n-2}&=(Z_n-Z_{n-2})+(Z_{n-1}-Z_{n-2})\\&=(S_n+Q_n-S_{n-2}-Q_{n-2})+(S_{n-1}+Q_{n-1}-S_{n-2}-Q_{n-2})\\&=((n-1)^k+n^k+(n-1)^{n-1}+n^n)+((n-1)^k+(n-1)^{n-1})\\&=n^n+n^k+......
  • P2951 [USACO09OPEN] Hide and Seek S 题解
    Problem题目概述给你一个无向图,边权都为\(1\),求:离\(1\)号点最远的点的编号、最远的距离、有几个点是离\(1\)号点最远的。思路直接用:优先队列\(BFS\),先求出\(1\)号点到每个点的最短路,存到\(dis\)数组中,然后再求\(max(dis[i])\),就搞定了。错误原因审题&做法错......
  • P1144 最短路计数 题解
    Problem考察算法:拓扑排序+\(DP\)+\(Dijkstra\)。题目简述给出一个无向无权图,问从顶点\(1\)开始,到其他每个点的最短路有几条。思路先求出\(1\)号点到每个点的最短路\(d_i\)。分析每条边$(x,y)$:如果d[x]+1==d[y]:这条边有用。将所有有用的边拓扑排序......
  • Codeforces Round 901 (Div
    C.JellyfishandGreenApple题解显然\(n\%m=0\),答案一定为\(0\)如果\(n>m\),我们显然可以将\(n/m\)的苹果分给每个人,然后再处理$n%m$如果\(n<m\),我们一定会将所有苹果一直对半切直到\(n>m\),所以答案每次对半切一定会加\(n\)直到\(n\%m=0\)的时......
  • [POI2003] Monkeys 题解
    [POI2003]Monkeys题解正着做貌似不好做,发现猴子是否掉落取决于“最后一根稻草”,也就是最后撒手的那个猴子,那我们考虑倒着把猴子网拼回去。这样,每群猴子掉落的时刻就是与\(1\)号猴子连通的时刻。利用并查集可以维护猴子的连通性,但是怎么更新答案呢?这里用vector进行了一个猴......
  • Codeforces Round 895 (Div. 3)
    A题简单的模拟计算,注意上取整的实现。B题计算每个房间对应的每个最迟时间点,在这些时间点最取最小值,保证能安全通过所有房间。D题拿到手就可以发现是贪心,但发现两部分会有冲突,也就是重复计算的部分。故提前找到两个数的lcm然后不计算lcm的倍数,为其他参与计算的数安排剩余数种的最......
  • CF1874C Jellyfish and EVA 题解
    题意给定一个有向无环图,对于任意一条边\((u_i,v_i)\),有\(u_i<v_i\)。定义一次从节点\(u\)开始的移动为如下过程:\(\tt{Alice}\)选择从\(u\)出发的且未被删除的一条边。\(\tt{Bob}\)在从\(u\)出发的且未被删除的边中等概率随机选择一条。若两人选择的边相同......