D

Problem - D - Codeforces

题意:

  给定一个有向图,每个点有自己的点权,求一条长度为K的路径使得路径上的最大点权最小,输出该条路径上的最大点权。

思路:(二分+拓扑排序)

  最小值最大的题考虑二分解决。

  我们每次二分答案为mx,以此判断有没有某条路径的最大值为mx且长度为k。因为我们要保证二分出来的mx是该条路径上最大的点权,所以所有大于mx的点我们都要舍弃。

  其次如果路径中含环那必然是可以的,如果不含吗,就需要判断是否存在长度为k,最大值为mx的路径

  举个例子:

    最初的图       

  当k == 4时,当我们判断mid = 4(既mx=4)时,则存在这样一条路径

                 

    chick返回true

  判断环的时候可以通过拓扑排序来判断

  在chick的时候需要注意的是,因为我们每次取的是小于等于mx的点,所以每次每个点的入度都不同,都需要重新统计

 1 const int N = 2e5 + 10,INF = 0x3f3f3f3f3f;
2 int n, m, k, w[N];
3 vector<int> g[N];
4 int vis[N], deg[N], deep[N];/*vis判断是否小于等于mx,deg统计入度,deep统计路径长度*/
5 vector<pair<int, int> >e;
6
7 bool chick(int mx) {
8 for (int i = 1; i <= n; ++i) vis[i] = 0, deg[i] = 0, deep[i] = -INF;
9 for (int i = 1; i <= n; ++i) {
10 if (w[i] <= mx)vis[i] = 1;
11 }
12 for (auto it : e) {
13 if (w[it.first] <= mx && w[it.second] <= mx) {
14 deg[it.second]++;
15 }
16 }
17 queue<int> q;
18 for (int i = 1; i <= n; ++i ) {
19 if (vis[i] && !deg[i])q.push(i),deep[i] = 1;
20 }
21 while (q.size()) {
22 int u = q.front();
23 q.pop();
24 for (int s : g[u]) {
25 if (!vis[s]) continue;
26 deep[s] = max(deep[s], deep[u] + 1);
27 if (deep[s] >= k) return 1;
28 deg[s]--;
29 if (deg[s] == 0) q.push(s);
30 }
31 }
32 for (int i = 1; i <= n; ++i) {
33 if (vis[i] && deg[i] > 0)return 1;
34
35 }
36 return 0;
37 }
38
39 void solve() {
40 cin >> n >> m >> k;
41 for (int i = 1; i <= n; ++i) cin >> w[i];
42 for (int i = 1; i <= m; ++i) {
43 int x, y;
44 cin >> x >> y;
45 g[x].push_back(y);
46 e.push_back({x, y});
47 }
48 if (k == 1) {
49 cout << *max_element(w + 1, w + 1 + n) << endl;
50 return;
51 }
52 int ans = INF;
53 int l = 0, r = 1e9 + 1;
54 for (int i = 1; i <= 50; ++i) {
55 int mid = (l + r) >> 1;
56 if (chick(mid)) {
57 ans = min(ans, mid);
58 r = mid - 1;
59 } else l = mid + 1;
60 }
61 if (ans == INF) {
62 cout << -1 << endl;
63 } else cout << ans << endl;
64 }

Codeforces Round #791(Div 2)——D的更多相关文章

  1. Codeforces Round #791 (Div. 2) A-C

    Codeforces Round #791 (Div. 2) A-C A 题目 https://codeforces.com/contest/1679/problem/A 题解 思路 知识点:数学,暴 ...

  2. Codeforces Round #366 (Div. 2) ABC

    Codeforces Round #366 (Div. 2) A I hate that I love that I hate it水题 #I hate that I love that I hate ...

  3. Codeforces Round #354 (Div. 2) ABCD

    Codeforces Round #354 (Div. 2) Problems     # Name     A Nicholas and Permutation standard input/out ...

  4. Codeforces Round #368 (Div. 2)

    直达–>Codeforces Round #368 (Div. 2) A Brain’s Photos 给你一个NxM的矩阵,一个字母代表一种颜色,如果有”C”,”M”,”Y”三种中任意一种就输 ...

  5. cf之路,1,Codeforces Round #345 (Div. 2)

     cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅.....   ...

  6. Codeforces Round #279 (Div. 2) ABCDE

    Codeforces Round #279 (Div. 2) 做得我都变绿了! Problems     # Name     A Team Olympiad standard input/outpu ...

  7. Codeforces Round #262 (Div. 2) 1003

    Codeforces Round #262 (Div. 2) 1003 C. Present time limit per test 2 seconds memory limit per test 2 ...

  8. Codeforces Round #262 (Div. 2) 1004

    Codeforces Round #262 (Div. 2) 1004 D. Little Victor and Set time limit per test 1 second memory lim ...

  9. Codeforces Round #371 (Div. 1)

    A: 题目大意: 在一个multiset中要求支持3种操作: 1.增加一个数 2.删去一个数 3.给出一个01序列,问multiset中有多少这样的数,把它的十进制表示中的奇数改成1,偶数改成0后和给 ...

随机推荐

  1. 【AGC】使用云调试优惠扣费、华为设备上触发崩溃、无法下载华为应用市场问题小结

    ​ 1.使用云调试剩余优惠时长还剩300分钟,但还会扣费的情况. 问题描述:用户的云调试账户显示剩余优惠时长还有300分钟,但在使用云调试的过程中,还是产生了扣费的情况. ​ 解决方案: 当开发者成功 ...

  2. Linux之Samba服务器搭建

    一,samba的基本概念 SMB(Server Messages Block,信息服务块)是一种在局域网上共享文件和打印机的一种通信协议,它为局域网内的不同计算机之间提供文件及打印机等资源的共享服务. ...

  3. ACVF of ARMA(1, 1)

    \(ARMA(1, ~ 1)\) process is a time series \(\left\{ X_{t} \right\}\) defined as: \[X_{t} - \phi X_{t ...

  4. 头文件与main函数

    头文件 1.为什么要使用头文件? 程序如戏 程序中有很多元素(std::cout, system), 都是一个个演员 但是他们之间都互不认识, 但是却要一起合作, 强行编译, 就会导致错误! 得预先介 ...

  5. KMP&Z函数详解

    KMP 一些简单的定义: 真前缀:不是整个字符串的前缀 真后缀:不是整个字符串的后缀 当然不可能这么简单的,来个重要的定义 前缀函数: 给定一个长度为\(n\)的字符串\(s\),其 \(前缀函数\) ...

  6. kubeadm join 命令执行流程

  7. Kubernetes中使用ClusterDNS进行服务发现

    在k8s集群中,服务是运行在Pod中的,Pod的发现和副本间负载均衡是我们面临的问题.我们使用Service解决了负载均衡的问题,但是集群环境中,service经常伴随着ip的变动而变动,得益于kub ...

  8. nginx进程所属用户问题讨论

    结论 1,在非root账户下启动时,nignx的master和worker进程的用户都将是这个账户, 2,在root账户下启动时 nignx的master进程是用户是root,worker的用户在co ...

  9. 1-VSCode搭建GD32开发环境

    一.使用VSCode开发GD32的原因 1-单片机开发用的最多的IDE为Keil,而Keil为商用软件,并非开源,而且只支持windows环境,介于当前关系,有断供的风险在. 2-其他IDE类似第1条 ...

  10. DeepHyperX代码理解-HamidaEtAl

    代码复现自论文<3-D Deep Learning Approach for Remote Sensing Image Classification> 先对部分基础知识做一些整理: 一.局 ...