最大流Dinic

本文深入解析了一种复杂度为O(V^2E)的图算法,通过使用邻接表、队列和深度优先搜索等数据结构与算法,实现了最大流问题的求解。该算法在解决网络流量、资源分配等问题中具有重要作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

复杂度O(V2E)O(V^2E)O(V2E)

const int maxn=2e3+100;
const int INF=0x3f3f3f3f;

ll n,m,tol,head[maxn];

struct edge{
    ll to,next,w;
}a[maxn*10];

void init(){
	memset(head,-1,sizeof head);
	tol=1;
}

inline void add(ll u,ll v,ll w){
    a[++tol]=(edge){v,head[u],w};head[u]=tol;
    a[++tol]=(edge){u,head[v],0};head[v]=tol;
}

ll dep[10010],cur[10010];
queue<ll>q;

ll bfs(ll s,ll t){
    ll i,u,v;
    for(i=s;i<=t;i++) dep[i]=-1,cur[i]=head[i];
    q.push(s);dep[s]=0;
    while(!q.empty()){
        u=q.front();q.pop();
        for(i=head[u];~i;i=a[i].next){
            v=a[i].to;if(~dep[v]||!a[i].w) continue;
            dep[v]=dep[u]+1;q.push(v);
        }
    }
    return ~dep[t];
}

ll dfs(ll u,ll t,ll lim){

    if(u==t||!lim) return lim;
    ll i,v,f,flow=0;
    for(i=cur[u];~i;i=a[i].next){
        v=a[i].to;cur[u]=i;
        if((dep[v]==dep[u]+1)&&(f=dfs(v,t,min(lim,a[i].w)))){
            a[i].w-=f;a[i^1].w+=f;
            flow+=f;lim-=f;
            if(!lim) return flow;
        }
    }
    return flow;
}

ll dinic(ll s,ll t){
    ll re=0;
    while(bfs(s,t)) re+=dfs(s,t,INF);
    return re;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值