dinic求调
查看原帖
dinic求调
653286
zhfaz123楼主2023/6/17 14:18

蒟蒻调了半小时,实在是不行了

评测记录:这里

代码:

#include<iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<climits>
#include<cstring>
#define N 1005
#define M 2005
using namespace std;
struct g
{
    int to,nxt,w;
}edge[M*2+1];
int cur[N+1],head[N+1],dep[N+1],cnt,n,m,e,s,t;
void inline add_edge(int u,int v,int w)
{
    auto &val=edge[++cnt];
    val.to=v;
    val.w=w;
    val.nxt=head[u];
    head[u]=cnt;
}
void inline add_arc(int u,int v,int w)
{
    add_edge(u,v,w);
    add_edge(v,u,0);
}//加边
bool bfs()
{
    memset(dep,0,sizeof(dep));
    queue<int> q;
    q.push(s);
    dep[s]=1;
    while(!q.empty())
    {
        int temp=q.front();
        for(int i=head[temp];i;i=edge[i].nxt)
        {
            int &to=edge[i].to,&w=edge[i].w;
            if(!dep[to] && w)
            {
                dep[to]=dep[temp]+1;
                q.push(to);
            }
        }
        q.pop();
    }
    if(dep[t]) return 1;
    return 0;
}//图分层
int dfs(int now,int flow)
{
    if(now==t)
    {
        return flow;
    }
    for(int &i=cur[now];i;i=edge[i].nxt)
    {
        int &to=edge[i].to,&w=edge[i].w;
        if(w)
        {
            int f=dfs(to,min(flow,w));
            if(f)
            {
                edge[i].w-=f;
                edge[((i-1)^1)+1].w+=f;//因为我的边是按1~cnt编号的,
                return f;              //所以要减一再加一
            }
        }
    }
    return 0;
}
int dinic()
{
    int ans=0;
    while(bfs())
    {
        for(int i=0;i<=n+m+2;i++)
        {
            cur[i]=head[i];
        }
        while(int ret=dfs(s,INT_MAX))
        {
            ans+=ret;
        }
    }
    return ans;
}//dinic主体
int main()
{
    scanf("%d %d %d",&n,&m,&e);
    s=0,t=m+n+1;//点按0~n+m+1编号
    for(int i=1;i<=n;i++)
    {
        add_arc(s,i,1);
    }
    for(int i=1;i<=m;i++)
    {
        add_arc(n+i,t,1);
    }
    for(int i=1;i<=e;i++)
    {
        int u,v;
        scanf("%d %d",&u,&v);
        add_arc(u,n+v,1);
    }//加边
    int ret=dinic();
    printf("%d",ret);
    return 0;
}
2023/6/17 14:18
加载中...