• [NOIP2010 提高组] 关押罪犯 二分答案/二分图染色


    P1525 [NOIP2010 提高组] 关押罪犯 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

     

     因为要求所有冲突值最大的要最小,而且答案具有单调性,最大数值大了容易分配,小了不容易分配。容易想到二分枚举答案。然后就是如何判断这个答案是否合法。当前答案为mid,那么比mid大的冲突就不能发生,又因为有两个监狱,每个人必定在其中一个,那么比当前枚举的答案大的边(两个人的冲突值)构成一个二分图,也就是说有冲突(边)的两个犯人在相对的监狱,并且同一个监狱没有冲突则符合要求。所以想到用二分图染色判断比mid大的边构成的图是否构成二分,如果是则这个答案合法。

    1. #include
    2. using namespace std;
    3. #pragma warning(disable:4996);
    4. #define int long long
    5. #define rep(j,b,e) for(int j=(b);j<=(e);j++)
    6. #define drep(j,e,b) for(int j=(e);j>=(b);j--)
    7. const int N = 2e5 + 10;
    8. int T = 1;
    9. int n, m, k;
    10. struct node {
    11. int t, v;
    12. };
    13. struct edge {
    14. int f, t, v;
    15. }edg[N];
    16. vectorgra[N];
    17. int vis[N];
    18. int match[N];
    19. int val[N];
    20. int fnd(int now, int tar) {//二分图匹配
    21. for (auto [nx, v] : gra[now]) {
    22. if (vis[nx] == 0) {
    23. vis[nx] = 1;
    24. if ((match[nx] == 0 && v <= tar) || fnd(match[nx], tar)) {
    25. match[nx] = now;
    26. return 1;
    27. }
    28. }
    29. }
    30. return 0;
    31. }
    32. int color[N];
    33. int dfs(int tar, int now, int c) {//二分图染色
    34. color[now] = c;
    35. for (auto& [nx, v] : gra[now]) {
    36. if (v < tar)continue;
    37. if (color[nx] == 0) {
    38. if (dfs(tar, nx, 3 - c) == 0)
    39. return 0;
    40. }
    41. else if (color[nx] == c)
    42. return 0;
    43. }
    44. return 1;
    45. }
    46. int check(int tar) {//二分判断函数
    47. int ok = 1;
    48. rep(j, 1, n) {
    49. if (color[j])continue;
    50. if (dfs(tar, j, 1) == 0)
    51. ok = 0;
    52. }
    53. return ok;
    54. }
    55. int mx = INT_MIN;
    56. int bi_find() {//二分查找
    57. int l = 0, r = mx + 1;
    58. int mid;
    59. while (l + 1 != r) {
    60. mid = (l + r) >> 1;
    61. memset(color, 0, sizeof(color));
    62. if (check(mid))
    63. r = mid;
    64. else
    65. l = mid;
    66. }
    67. return l;
    68. }
    69. signed main() {
    70. #ifndef ONLINE_JUDGE
    71. //freopen("out.txt", "w", stdout);
    72. freopen("in.txt", "r", stdin);
    73. #endif
    74. ios::sync_with_stdio(0); cout.tie(0);
    75. cin >> n >> m;
    76. rep(j, 1, m) {
    77. int f, t, v;
    78. cin >> f >> t >> v;
    79. mx = max(mx, v);
    80. gra[f].push_back({ t,v });
    81. gra[t].push_back({ f,v });
    82. edg[j] = { f,t,v };
    83. }
    84. cout << bi_find();
    85. }

  • 相关阅读:
    springboot宴会预定平台 毕业设计-附源码231718
    hadoop学习:mapreduce的wordcount时候,继承mapper没有对应的mapreduce的包
    Hdu2022 多校训练(5) BBQ
    Trustzone/TEE/安全 面试100问
    读书笔记:《量化投资实务》
    VUE3+Vite3开发网易云音乐 Day1 后端环境搭建
    Android 和 iOS 漏洞加剧移动安全的威胁
    python调用C语言库
    四级翻译知识点小结
    Golang | Leetcode Golang题解之第7题整数反转
  • 原文地址:https://blog.csdn.net/m0_60777643/article/details/126239820