Dinic求调,样例未过!
查看原帖
Dinic求调,样例未过!
939580
xzy_caiji楼主2025/7/22 16:29
#include<bits/stdc++.h>
using namespace std;
int n,s,t,head[50005],nxt[50005],vet[50005],dep[50005],cur[50005],en=1;
bool vis[50005];long long wei[50005],maxflow;
void addedge(int u,int v,int w){
    vet[++en]=v;wei[en]=w;nxt[en]=head[u];head[u]=en;
}
bool bfs(){
    for(int i=0;i<=n;i++)cur[i]=head[i],dep[i]=0x3f3f3f3f,vis[i]=0;
    queue<int>que;que.push(s);dep[s]=0;
    while(!que.empty()){
        int u=que.front();que.pop();vis[u]=0;
        for(int i=head[u];i;i=nxt[i]){
            int v=vet[i];
            if(dep[v]>dep[u]+1&&wei[i]){
                dep[v]=dep[u]+1;
                if(vis[v]==0){
                    que.push(v);
                    vis[v]=1;
                }
            }
        }
    }
    if(dep[t]!=0x3f3f3f3f)return 1;
    return 0;
}
long long dfs(int u,long long flow){
    long long rlow=0;
    if(u==t){
        maxflow+=flow;
        return flow;
    }
    long long used=0;
    for(int i=cur[u];i;i=nxt[i]){
        cur[u]=i;
        int v=vet[i];
        if(wei[i]&&dep[v]==dep[u]+1){
            if(rlow=dfs(v,min(flow-used,wei[i]))){
                used+=rlow;
                wei[i]-=rlow;
                wei[i^1]+=rlow;
                if(used==flow)break;
            }
        }
    }
    return used;
}
long long Dinic(){
    while(bfs()){
        dfs(s,0x3f3f3f3f);
    }
    return maxflow;
}
bool flag[1005][1005];
signed main(){
    int nn,m,e;cin>>nn>>m>>e;
    for(int i=1;i<=e;i++){
        int x,y;cin>>x>>y;
        y+=nn;
        if(flag[x][y])continue;
        flag[x][y]=1;
        addedge(x,y,1);
    }
    n=nn+m+2;
    s=nn+m+1;t=nn+m+2;
    for(int i=1;i<=nn;i++)addedge(s,i,1);
    for(int i=nn+1;i<=nn+m;i++)addedge(i,t,1);
    cout<<Dinic()<<'\n';
    return 0;
}
2025/7/22 16:29
加载中...