网络流最大流

/*网络流最大流模板
输入:
点数n,边数m,起点s,终点t
m条边:起点,终点,最大流量
输出:
最大流*/

const int maxn=10010;
const int inf=1e15;
int n,m,s,t;

struct edge{
    int to,next,value;
}e[maxn];
int first[maxn]={0},cntedge=0;
void addedge(int fr,int to,int value){
    e[cntedge++]={to,first[fr],value};first[fr]=cntedge-1;
    swap(fr,to);
    e[cntedge++]={to,first[fr],0};first[fr]=cntedge-1;
}

int dis[210];
int cur[maxn];

int bfs(){
    memset(dis,-1,sizeof(dis));
    queue<int>q;
    cur[s]=first[s];
    dis[s]=0;q.push(s);
    while(!q.empty()){
        int u=q.front();q.pop();
        for(int i=first[u];i!=-1;i=e[i].next){
            int v=e[i].to;
            if(dis[v]==-1&&e[i].value>0){
                dis[v]=dis[u]+1;
                cur[v]=first[v];
                q.push(v);
            }
        }
    }
    return dis[t]!=-1;
};

int dfs(int u,int exp){
    if(u==t)return exp;
    int flow=0,tmp=0;
    for(int i=cur[u];i!=-1;i=e[i].next){
        int v=e[i].to;
        cur[u]=i;
        if((dis[v]==dis[u]+1)&&(e[i].value>0)){
            tmp=dfs(v,min(exp,e[i].value));
            if(!tmp){dis[v]=0;continue;}
            exp-=tmp;
            flow +=tmp;
            e[i].value -=tmp;
            e[i^1].value +=tmp;
            if(!exp)break;
        }
    }
    return flow;
}
while(bfs()){
	ans+=dfs(s,inf);
}
posted @ 2020-11-17 09:26  yesuweiYYYY  阅读(66)  评论(0编辑  收藏  举报