_lgl の blog

和每一个即将分别的朋友大方拥抱,微笑告别

0%

通用

快读

快写

1、数学

快速幂

矩阵快速幂

排序算法(结构体,vector)

哈希

组合数

逆元

中国剩余定理

2、图论

并查集

线性筛

随机,卡时间

最短路径

st()

线段树

树状数组

二分图最大匹配

3、玄学

rand_shuffle

rand(time(null))

卡时

lower_bound(arr, arr + arr.size(), val)

返回一个迭代器,返回指向大于等于val的第一个值的位置

阅读全文 »

排序的种类

排序分为内部排序外部排序

一般为内部排序,可以划分为八大排序

八大排序算法是:1、直接插入排序;2、希尔排序;3、简单选择排序;4、堆排序;5、冒泡排序;6、快速排序;7、归并排序;8、桶排序/基数排序。

阅读全文 »

也不知道2019年里我改变了多少,依然那么单纯,幻想,焦虑,抑郁,仍然不知道自己现在能不能接受自己,一无是处,一事无成,那有如何呢,都过去了呢,也回不去了呢。

想过2019年曾自己立了无数个flag,现在又实现了几个,对未来还是好迷茫,感受不到光。

人生下来有什么意义呢,活着,死去。时间冲刷后又留下了什么,死后又去了哪里?

阅读全文 »

【模板】线段树 2

题目描述

如题,已知一个数列,你需要进行下面三种操作:

  • 将某区间每一个数乘上 $x$

  • 将某区间每一个数加上 $x$

  • 求出某区间每一个数的和

阅读全文 »

【模板】线段树 1

题目描述

如题,已知一个数列,你需要进行下面两种操作:

  1. 将某区间每一个数加上 $k$。
  2. 求出某区间每一个数的和。
阅读全文 »

EK - Edmond-Karp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
// EK(Edmond-Karp) : 利用bfs实现,时间复杂度O(V*E^2)
#include <cstdio>
#include <iostream>
#include <queue>
#include <cstring>
#include <cctype>
#include <algorithm>
#define rg register

const int maxn = 1e5 + 7;
const int inf = 2147483647;
using namespace std;

namespace _lgl{

int n, m, s, t, tot, head[maxn];
bool vis[maxn];

struct edge{
int to, val, next;
}e[maxn << 1];

struct Pre{
int point, edge;
}pre[maxn];

inline void add(int x,int y,int z){
e[++tot].to = y;
e[tot].next = head[x];
e[tot].val = z;
head[x] = tot;
}

inline int rd(){
int f = 1, s = 0; char c = getchar();
for(;!isdigit(c);c = getchar()) if(c == '-') f = -1;
for(; isdigit(c);c = getchar()) s = (s << 3) + (s << 1) + c - '0';
return f * s;
}

inline bool bfs(){
queue <int> q;
memset(vis, 0, sizeof(vis));
memset(pre,-1, sizeof(pre));
vis[s] = true; q.push(s);
while(!q.empty()){
int now = q.front(); q.pop();
for(int i = head[now]; i; i = e[i].next){
int to = e[i].to;
if(!vis[to] && e[i].val){
pre[to].point = now;
pre[to].edge = i;
if(to == t) return true;
vis[to] = 1;
q.push(to);
}
}
}
}

inline int EK(){
int ans = 0;
while(bfs()){
int mi = inf;
for(int i = t; i != s; i = pre[i].point) mi = mi < e[pre[i].edge].val ? mi : e[pre[i].edge].val;
for(int i = t; i != s; i = pre[i].point){
e[pre[i].edge].val -= mi;
e[pre[i].edge^1].val += mi;
}
ans += mi;
}
return ans;
}

inline void main(){
n = rd(), m = rd(), s = rd(), t = rd();
for(int x, y, z, i = 1; i <= m; i++)
x = rd(), y = rd(), z = rd(), add(x,y,z), add(y,x,0);
printf("%d",EK());
return;
}

}

int main(){
_lgl::main();
return 0;
}