不加弧优化只有#9#10会TLE,加了之后变成了#4 -#10全TLE
#include <bits/stdc++.h>
#define int long long
#define ms(a, b) memset(a, b, sizeof(a))
using namespace std;
int Min(int a, int b) { return a < b ? a : b; }
const int inf = 0x7fffffff;
const int Maxn = 205;
const int Maxm = 5005;
struct edge
{
int to, nxt, cap, flow;
} e[Maxm << 1];
int head[Maxn], cnt=-1,cur[Maxn];
void add(int u, int v, int w)
{
e[++cnt].to = v;
e[cnt].cap = w;
e[cnt].flow = 0; // 初始化flow为0
e[cnt].nxt = head[u];
head[u] = cnt;
e[++cnt].to = u;
e[cnt].cap = 0;
e[cnt].flow = 0; // 初始化flow为0
e[cnt].nxt = head[v];
head[v] = cnt;
}
int n, m, s, t, d[Maxn];
bool bfs()
{
queue<int> q;
bool vis[Maxn];
ms(vis, 0);
ms(d, 0); // 每次bfs时初始化d数组
d[s] = 1;
vis[s] = 1;
cur[s] = head[s];
q.push(s);
while (!q.empty())
{
int u = q.front();
q.pop();
for (int i = head[u]; ~i; i = e[i].nxt)
{
int to = e[i].to;
if (!vis[to] && e[i].cap - e[i].flow > 0)
{
q.push(to);
vis[to] = 1;
d[to] = d[u] + 1;
cur[to] = head[to];
if(to == t) return true;
}
}
}
return false;
}
int dfs(int u, int a)
{
if (u == t)
return a;
int tmp = 0, delta;
for (int i = cur[u]; ~i; i = e[i].nxt)
{
cur[u] = i;
int to = e[i].to;
if (d[to] == d[u] + 1 && (delta = dfs(to, Min(a, e[i].cap - e[i].flow))) > 0)
{
e[i].flow += delta;
e[i ^ 1].flow -= delta; // 修改反向边的流量
tmp += delta;
a -= delta;
if (a == 0)
break;
}
}
return tmp;
}
int dinic()
{
int sum = 0, tf;
while (bfs())
{
while (tf = dfs(s, inf))
{
sum += tf;
}
}
return sum;
}
signed main()
{
ms(head,-1);
ios::sync_with_stdio(false);
cin >> n >> m >> s >> t;
for (int i = 1; i <= m; i++)
{
int u, v, w;
cin >> u >> v >> w;
add(u, v, w);
}
cout << dinic();
return 0;
}