• [补题记录] Atcoder Beginner Contest 299(E)


    URL:https://atcoder.jp/contests/abc299

    目录

    E

    Problem/题意

    Thought/思路

    Code/代码


    E

    Problem/题意

    给出 N(1 <= N <= 2000)个点和 M 条边的一个无向图,要求用白色和黑色对这个图染色。

    满足下面两个条件,则输出 Yes 和各点的颜色,否则输出 No:

    • 至少有一个黑色点;
    • 给出 K 个条件(p,d),要求距离 p 最短距离为 d 的点至少一个需要染成黑色;

    Thought/思路

    这道题的坑点在于,题目没有很清楚地说明,只要有一个黑色点与 p 最短句路为 d 即可。因此很容易误认为所有距离 p 为 d 的点都要染黑。

    搞清楚这点思路就很明确了,对于每个要求(p,d),bfs 把所有最短距离小于 d 的点都染成白色;

    再次 bfs,判断是否有一个距离为 d 的且不为白色的点,有则 return true,否则这个要求不能满足,输出 No。

    Code/代码

    1. #include "bits/stdc++.h"
    2. int n, m, dis[2003], ans[2003];
    3. std::vector <int> g[2003];
    4. struct K {
    5. int p, d;
    6. }tmp[2003];
    7. void white(int s, int d) {
    8. for (int i = 1; i <= n; ++ i) dis[i] = INT_MAX;
    9. std::queue int, int>> q;
    10. q.push({s, 0});
    11. dis[s] = 0;
    12. while (!q.empty()) {
    13. auto o = q.front(); q.pop();
    14. int x = o.first, pre = o.second;
    15. for (auto &next : g[x]) {
    16. if (next == pre) continue;
    17. if (dis[next] > dis[x] + 1) {
    18. dis[next] = dis[x] + 1;
    19. q.push({next, x});
    20. }
    21. }
    22. }
    23. for (int i = 1; i <= n; ++ i) {
    24. if (dis[i] < d) ans[i] = 0;
    25. }
    26. }
    27. bool black(int s, int d) {
    28. for (int i = 1; i <= n; ++ i) dis[i] = INT_MAX;
    29. std::queue int, int>> q;
    30. q.push({s, 0});
    31. dis[s] = 0;
    32. while (!q.empty()) {
    33. auto o = q.front(); q.pop();
    34. int x = o.first, pre = o.second;
    35. for (auto &next : g[x]) {
    36. if (next == pre) continue;
    37. if (dis[next] > dis[x] + 1) {
    38. dis[next] = dis[x] + 1;
    39. q.push({next, x});
    40. }
    41. }
    42. }
    43. for (int i = 1; i <= n; ++ i) {
    44. if (dis[i] == d and ans[i] != 0) {
    45. ans[i] = 1;
    46. return true;
    47. }
    48. }
    49. return false;
    50. }
    51. signed main () {
    52. std::cin >> n >> m;
    53. for (int i = 1; i <= m; ++ i) {
    54. int x, y; std::cin >> x >> y;
    55. g[x].push_back(y);
    56. g[y].push_back(x);
    57. }
    58. for (int i = 1; i <= n; ++ i) ans[i] = -1;
    59. int k; std::cin >> k;
    60. for (int i = 1; i <= k; ++ i) {
    61. std::cin >> tmp[i].p >> tmp[i].d; // 题目保证:pi < pj [i < j]
    62. white(tmp[i].p, tmp[i].d);
    63. }
    64. bool flag = true;
    65. for (int i = 1; i <= k; ++ i) {
    66. int s = tmp[i].p, d = tmp[i].d;
    67. if (!black(s, d)) {
    68. flag = false;
    69. break;
    70. }
    71. }
    72. if (!flag) {
    73. std::cout << "No";
    74. } else {
    75. if (k == 0) ans[1] = 1;
    76. std::cout << "Yes\n";
    77. for (int i = 1; i <= n; ++ i)
    78. std::cout << (ans[i] == -1 ? 0 : ans[i]);
    79. }
    80. return 0;
    81. }

  • 相关阅读:
    九九重阳,永恒之约 | AIGC数字永生时代,揭示永生探索的全新维度!
    GeoServer发布地图服务(WMS、WFS)
    Windows 11 手机诞生,还是双屏的?
    [8]xss你清楚吗
    IDEA踩坑记录:查找用法 找到的不全怎么办
    平均回复在5s内的快捷短语
    【从头构筑C#知识体系】2.2 分部类型
    SpringBoot接收LocalDateTime参数
    SpringSecurity + JWT(前后端分离)
    通师高专科技创新社训练赛(20221130)
  • 原文地址:https://blog.csdn.net/joyride_run/article/details/133298619