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

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

#include <iostream>
#include <cstdio>
#include <cstring>
#include <ext/pb_ds/priority_queue.hpp> typedef long long ll;
typedef __gnu_pbds::priority_queue<std::pair<int, int>, std::less<std::pair<int, int> >, __gnu_pbds::binomial_heap_tag >pq; struct Edge {int from, to, nxt, val;}; const int maxn = 3e3 + ;
const int maxm = 4e5 + ;
const int inf = ;
int n, r;
bool vis[maxn], bin[maxn];
Edge e[maxm * + ];
int head[maxn], id[maxn][maxn], esz; inline ll read() {
int x = , f = ; char ch = getchar();
while(ch < '' || ch > '') {if(ch == '-')f = -; ch = getchar();}
while(ch >= '' && ch <= '') {x = x * + ch - ''; ch = getchar();}
return x * f;
} inline void add_edge(int from, int to, int val) {
if(id[from][to] == -) {
e[esz].from = from, e[esz].to = to, e[esz].val = val, e[esz].nxt = head[from];
id[from][to] = esz; head[from] = esz++;
} else {
e[id[from][to]].val += val;
}
} inline void init() {
memset(bin, false, sizeof(bin));
memset(head, -, sizeof(head));
memset(id, -, sizeof(id));
esz = ;
} pq que;
pq::point_iterator it[maxn];
inline int contract(int &s, int &t) { // Find s,t
memset(vis, false, sizeof(vis));
int i, j, k, mincut, maxc;
while(!que.empty()) que.pop();
for(i = ; i <= n; ++i)
if(!bin[i])it[i] = que.push(std::make_pair(, i));
else it[i] = nullptr;
for(i = ; i <= n; i++) {
k = -; maxc = -;
if(que.empty()) return mincut;
k = que.top().second, maxc = que.top().first; que.pop();
s = t; t = k; mincut = maxc; vis[k] = true;
for(j = head[k]; ~j; j = e[j].nxt) {
int v = e[j].to, w = e[j].val;
if(!bin[v] && !vis[v]) {
que.modify(it[v], std::make_pair((it[v]->first) + w, v));
}
}
}
return mincut;
} inline int Stoer_Wagner() {
int mincut, i, j, s, t, ans;
for(mincut = inf, i = ; i < n; i++) {
ans = contract(s, t);
bin[t] = true;
if(mincut > ans) mincut = ans;
if(mincut == )return ;
for(j = ; j <= n; j++) if(!bin[j]) {
if(id[j][t] == -)continue;
if(id[s][j] == -)add_edge(s, j, e[id[j][t]].val);
else e[id[s][j]].val += e[id[j][t]].val;
if(id[j][s] == -)add_edge(j, s, e[id[j][t]].val);
else e[id[j][s]].val += e[id[j][t]].val;
}
}
return mincut;
} int main() {
int m;
while(scanf("%d%d", &n, &m) != -) {
init();
for(int i = ; i <= m; i++) {
int a, b, c;
a = read(), b = read(), c = read();
add_edge(a, b, c); add_edge(b, a, c);
}
printf("%d\n", Stoer_Wagner());
}
return ;
}

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. Java集合总结(一):列表和队列

    java中的具体容器类都不是从头构建的,他们都继承了一些抽象容器类.这些抽象容器类,提供了容器接口的部分实现,方便具体容器类在抽象类的基础上做具体实现.容器类和接口的关系架构图如下: 虚线框表示接口, ...

  2. 数据结构实验之数组二:稀疏矩阵(SDUT 3348)

    Problem Description 对于一个n*n的稀疏矩阵M(1 <= n <= 1000),采用三元组顺序表存储表示,查找从键盘输入的某个非零数据是否在稀疏矩阵中,如果存在则输出O ...

  3. UVALive 4726 Average ——(斜率优化DP)

    这是第一次写斜率优化DP= =.具体的做法参照周源论文<浅谈数形结合思想在信息学竞赛中的应用>.这里仅提供一下AC的代码. 有两点值得注意:1.我这个队列的front和back都是闭区间的 ...

  4. fork() 成为负担,需要淘汰 spawn

    A fork() in the road - Microsoft Research https://www.microsoft.com/en-us/research/publication/a-for ...

  5. Vue生命周期钩子函数加载顺序的理解

    Vue实例有一个完整的生命周期,也就是从开始创建.初始化数据.编译模板.挂载Dom.渲染→更新→渲染.卸载等一系列过程,我们称这是Vue的生命周期.通俗说就是Vue实例从创建到销毁的过程,就是生命周期 ...

  6. kotlin 类的委托

    fun main(arg: Array<String>) { val baseImpl = baseImpl() demo(baseImpl).printL() } interface b ...

  7. Objective-C如何自己实现一个基于数组下标的属性访问模式

    在iOS6.0以及OS X10.8之后,Apple引入了一套非正式协议(informal protocol)与Objective-C语法直接绑定.当你实现了这其中的方法之后即可使用数组下标来访问属性元 ...

  8. 安装mysql问题解决

    [root@apollo init.d]# /etc/init.d/mysqld startmy_print_defaults: Can't read dir of '/etc/my.cnf.' (E ...

  9. 西湖论剑2019部分writeup

    做了一天水了几道题发现自己比较菜,mfc最后也没怼出来,被自己菜哭 easycpp c++的stl算法,先读入一个数组,再产生一个斐波拉契数列数组 main::{lambda(int)#1}::ope ...

  10. Linux发行版本简介

    Linux发行版 1.      Linux本身 1.1.        1991年,当时一名来自赫尔辛基的计算机科学学生LinusTorvalds创建了一个操作系统内核 1.1.1.     一年后 ...