全局最小割 Stoer-Wagner (SW算法)优化

优化吃藕了,感谢放宽时限,感谢平板电视 (pb_ds)

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <ext/pb_ds/priority_queue.hpp>
  5.  
  6. typedef long long ll;
  7. typedef __gnu_pbds::priority_queue<std::pair<int, int>, std::less<std::pair<int, int> >, __gnu_pbds::binomial_heap_tag >pq;
  8.  
  9. struct Edge {int from, to, nxt, val;};
  10.  
  11. const int maxn = 3e3 + ;
  12. const int maxm = 4e5 + ;
  13. const int inf = ;
  14. int n, r;
  15. bool vis[maxn], bin[maxn];
  16. Edge e[maxm * + ];
  17. int head[maxn], id[maxn][maxn], esz;
  18.  
  19. inline ll read() {
  20. int x = , f = ; char ch = getchar();
  21. while(ch < '' || ch > '') {if(ch == '-')f = -; ch = getchar();}
  22. while(ch >= '' && ch <= '') {x = x * + ch - ''; ch = getchar();}
  23. return x * f;
  24. }
  25.  
  26. inline void add_edge(int from, int to, int val) {
  27. if(id[from][to] == -) {
  28. e[esz].from = from, e[esz].to = to, e[esz].val = val, e[esz].nxt = head[from];
  29. id[from][to] = esz; head[from] = esz++;
  30. } else {
  31. e[id[from][to]].val += val;
  32. }
  33. }
  34.  
  35. inline void init() {
  36. memset(bin, false, sizeof(bin));
  37. memset(head, -, sizeof(head));
  38. memset(id, -, sizeof(id));
  39. esz = ;
  40. }
  41.  
  42. pq que;
  43. pq::point_iterator it[maxn];
  44. inline int contract(int &s, int &t) { // Find s,t
  45. memset(vis, false, sizeof(vis));
  46. int i, j, k, mincut, maxc;
  47. while(!que.empty()) que.pop();
  48. for(i = ; i <= n; ++i)
  49. if(!bin[i])it[i] = que.push(std::make_pair(, i));
  50. else it[i] = nullptr;
  51. for(i = ; i <= n; i++) {
  52. k = -; maxc = -;
  53. if(que.empty()) return mincut;
  54. k = que.top().second, maxc = que.top().first; que.pop();
  55. s = t; t = k; mincut = maxc; vis[k] = true;
  56. for(j = head[k]; ~j; j = e[j].nxt) {
  57. int v = e[j].to, w = e[j].val;
  58. if(!bin[v] && !vis[v]) {
  59. que.modify(it[v], std::make_pair((it[v]->first) + w, v));
  60. }
  61. }
  62. }
  63. return mincut;
  64. }
  65.  
  66. inline int Stoer_Wagner() {
  67. int mincut, i, j, s, t, ans;
  68. for(mincut = inf, i = ; i < n; i++) {
  69. ans = contract(s, t);
  70. bin[t] = true;
  71. if(mincut > ans) mincut = ans;
  72. if(mincut == )return ;
  73. for(j = ; j <= n; j++) if(!bin[j]) {
  74. if(id[j][t] == -)continue;
  75. if(id[s][j] == -)add_edge(s, j, e[id[j][t]].val);
  76. else e[id[s][j]].val += e[id[j][t]].val;
  77. if(id[j][s] == -)add_edge(j, s, e[id[j][t]].val);
  78. else e[id[j][s]].val += e[id[j][t]].val;
  79. }
  80. }
  81. return mincut;
  82. }
  83.  
  84. int main() {
  85. int m;
  86. while(scanf("%d%d", &n, &m) != -) {
  87. init();
  88. for(int i = ; i <= m; i++) {
  89. int a, b, c;
  90. a = read(), b = read(), c = read();
  91. add_edge(a, b, c); add_edge(b, a, c);
  92. }
  93. printf("%d\n", Stoer_Wagner());
  94. }
  95. return ;
  96. }

2017"百度之星"程序设计大赛 - 资格赛 1002 度度熊的王国战略的更多相关文章

  1. hdu 6082 度度熊与邪恶大魔王(2017"百度之星"程序设计大赛 - 资格赛 )

    度度熊与邪恶大魔王 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  2. 2017"百度之星"程序设计大赛 - 资格赛【1001 Floyd求最小环 1002 歪解(并查集),1003 完全背包 1004 01背包 1005 打表找规律+卡特兰数】

    度度熊保护村庄 Accepts: 13 Submissions: 488 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/3276 ...

  3. [SinGuLaRiTy] 2017 百度之星程序设计大赛-资格赛

    [SinGuLaRiTy-1034] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. 度度熊保护村庄  Time Limit: 2000/10 ...

  4. 2017"百度之星"程序设计大赛 - 资格赛

    度度熊与邪恶大魔王  Accepts: 3666  Submissions: 22474  Time Limit: 2000/1000 MS (Java/Others)  Memory Limit: ...

  5. 2014年百度之星程序设计大赛 - 资格赛 1002 Disk Schedule(双调欧几里得旅行商问题)

    Problem Description 有非常多从磁盘读取数据的需求,包含顺序读取.随机读取.为了提高效率,须要人为安排磁盘读取.然而,在现实中,这样的做法非常复杂.我们考虑一个相对简单的场景.磁盘有 ...

  6. 2017"百度之星"程序设计大赛 - 资格赛-度度熊与邪恶大魔王(dp+后缀最小值)

    度度熊与邪恶大魔王 思路:由于防御和血量的范围很小,所以暴力枚举出对于每种防御造成的每种伤害所需的最小花费,最后只需在伤害大于等于血量的情况下再找到最小花费(这个只需要后缀最小值预处理一下就可以了) ...

  7. 2018"百度之星"程序设计大赛 - 资格赛 1002 子串查询

    题面又是万能的毒毒熊... 实在不想写了,就只写了这题 记26个前缀和查询枚举最小值直接算 实在是氵的死 而且我忘记输出Case #%d 想了很久 >_< #include<bits ...

  8. 2017"百度之星"程序设计大赛 - 资格赛 寻找母串

    Problem Description 对于一个串S,当它同时满足如下条件时,它就是一个01偏串: 1.只由0和1两种符组成: 2.在S的每一个前缀中,0的个数不超过1的个数: 3.S中0的个数和1的 ...

  9. 2017"百度之星"程序设计大赛 - 资格赛 度度熊的王国战略

    度度熊的王国战略 度度熊国王率领着喵哈哈族的勇士,准备进攻哗啦啦族. 哗啦啦族是一个强悍的民族,里面有充满智慧的谋士,拥有无穷力量的战士. 所以这一场战争,将会十分艰难. 为了更好的进攻哗啦啦族,度度 ...

随机推荐

  1. 数据分析九:互联网征信中的信用评分模型(用户APP使用行为分析)

    用户APP使用行为数据分析: 一. 背景及数据介绍: 1. 移动互联网发展背景: 网民规模7.72亿,手机网民规模7.53亿: 2. APP使用热点: 商务交易类应用规模高速增长(网络购物,网上外卖, ...

  2. LOJ3120. 「CTS2019」珍珠 [容斥,生成函数]

    传送门 思路 非常显然,就是要统计有多少种方式使得奇数的个数不超过\(n-2m\).(考场上这个都没想到真是身败名裂了--) 考虑直接减去钦点\(n-2m+1\)个奇数之后的方案数,但显然这样会算重, ...

  3. Vs中包含目录、库目录、附加包含目录、附加库目录、附加依赖项之详解

    VS项目中的包含目录.库目录.附加包含目录.附加库目录.附加依赖项均在"项目->属性->配置属性"下进行配置,具体说明如下: VC++目录: 包含目录:寻找#inclu ...

  4. luogu2331

    P2331 [SCOI2005]最大子矩阵 题目描述 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. 输入格式 第一行为n,m,k ...

  5. saltstack运维工具

    salt介绍 saltstack是由thomas Hatch于2011年创建的一个开源项目,设计初衷是为了实现一个快速的远程执行系统. salt强大吗 系统管理员日常会进行大量的重复性操作,例如安装软 ...

  6. 为win10下的linux子系统终端添加powerline

    一切按照上一篇完成,如果成功了,你厉害了我的哥,如果不成功,win10安装powerline字体才可以,才可以,才可以 sudo apt install build-essential cmake g ...

  7. tmux 入门踩坑记录

    软件安装 sudo apt-get install tmux 1. 分割左右窗口 ^b -> % 运行 tmux 新建一个 tmux 的会话(session),此时窗口唯一的变化是在底部会出现一 ...

  8. Java排序之计数排序

    Java排序之计数排序 计数排序思路 计数排序适用于有明确范围的数组,比如给定一个数组,且知道所有值得范围是[m,n].这个时候可以使用一个n-m+1长度的数组,待排序的数组就可以散在这个数组上,数组 ...

  9. Jmeter Web 性能测试入门 (七):Performance 测试中踩过 Jmeter 的坑

    脚本运行的过程中,大量request抛error,但没有地方能够查看request是因为什么error的. 原因:Jmeter默认禁掉了运行过程中每个request的具体response信息收集,只保 ...

  10. [Phoenix] Mix 命令

    mix phx.gen.html 命令生成模板: # 其中 name 和 age 是 schema 字段名称,后面跟的是类型 # 下面这样的写法,会生成 controller 和 service 层的 ...