dinic求调
查看原帖
dinic求调
1079004
shujingnuli楼主2025/2/4 18:27

不加弧优化只有#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;
}
2025/2/4 18:27
加载中...