# Dinic重边处理模板

摘要:
Dinic双面处理模板https://www.luogu.com.cn/problem/P2936与一般的最大流问题相比,这个问题只多了一条重叠边,意义不大。不过,我还是想把它录下来。反正不需要太多时间。这里的处理方法是使用二维数组对边缘集进行预处理,合并多个边缘,然后使用二维数组作为Dinic的输入。我目前还没有想到更好的处理方法。我希望你能给我一些建议#include<bits/stdc++。h>使用名称
Dinic重边处理模板

https://www.luogu.com.cn/problem/P2936

本题相比普通最大流题目只是多了一个重边的处理,意义不大,但还是想记录一下,反正也花不了多少时间。

这里的处理方式是使用二维数组预处理边集,将重边合并,再将该二维数组作为Dinic的输入,暂时没有想到更好的处理方式,望大佬指教。

#include <bits/stdc++.h>
using namespace std;
#define fre freopen("data.in","r",stdin);
#define ms(a) memset((a),0,sizeof(a))
#define go(i,a,b) for(register int (i)=(a);(i)<(b);++(i))
#define rep(i,a,b) for(register int (i)=(a);(i)<=(b);++(i))
#define sf(x) scanf("%d",&(x))
#define reg register
typedef long long LL;
const int inf=(0x7f7f7f7f);
const int maxn=1e2;
const int maxm=1e3;
int n;
struct node{int to,flow,next;}e[maxm<<1];
int head[maxn],cur[maxn],deep[maxn];
int cnt;
int m[100][100];
queue<int> q;
inline void add(int x,int y,int w){
    e[cnt].to=y,e[cnt].flow=w,e[cnt].next=head[x];
    head[x]=cnt++;
}
inline void in(){
    sf(n);
    memset(head,-1,sizeof(head));
    char x,y;int w;
    go(i,0,n){
        scanf(" %c %c %d",&x,&y,&w);
      //  cout<<x<<y<<w;
        m[x-'A'][y-'A']+=w;  //将重边合并
    }

    go(i,0,100)go(j,0,100)
        if(m[i][j]){
            add(i,j,m[i][j]);
            add(j,i,0);
        }
}
inline bool bfs(){
    ms(deep);
    deep[0]=1;q.push(0);
    int u,v;
    while(!q.empty()){
        u=q.front();q.pop();
        for(int i=head[u];~i;i=e[i].next){
            v=e[i].to;
            if(!deep[v]&&e[i].flow){
                deep[v]=deep[u]+1;
                q.push(v);
            }
        }
    }
    return deep[25];
}
int dfs(int now,int nowFlow){
    if(now==25)return nowFlow;
    int totFlow=0;
    int v;
    for(int i=cur[now];~i;i=e[i].next){
        cur[now]=i;v=e[i].to;
        if(deep[v]==deep[now]+1&&e[i].flow){
            int canFlow=0;
            canFlow=dfs(v,min(nowFlow,e[i].flow));
            if(!canFlow)continue;
            nowFlow-=canFlow,totFlow+=canFlow;
            e[i].flow-=canFlow,e[i^1].flow+=canFlow;
            if(nowFlow<=0)break;
        }
    }
    if(totFlow<=0)deep[now]=-2;
    return totFlow;
}
inline void Dinic(){
    int maxFlow=0;
    while(bfs()){
        memcpy(cur,head, sizeof(head));
        maxFlow+=dfs(0,inf);
    }
    printf("%d
",maxFlow);
}
int main(){
    in();
    Dinic();
    return 0;
}

免责声明:文章转载自《# Dinic重边处理模板》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇通信知识科普luaFramework下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

git flow常用命令

https://danielkummer.github.io/git-flow-cheatsheet/index.zh_CN.html https://blog.csdn.net/shu580231/article/details/76240611 https://blog.csdn.net/zpcqdkf/article/details/82621893...

Openflow协议详解

http://www.h3c.com/cn/d_201811/1131080_30005_0.htm# 1 OpenFlow背景 转发和控制分离是SDN网络的本质特点之一 。在SDN网络架构中,控制平面与转发平面分离,网络的管理和状态在逻辑上集中到一起,底层的网络基础从应用中独立出来,由此,网络获得前所未有的可编程、可控制和自动化能力。这使用户可以很容易根...

python-Mitmproxy抓包

一、使用 安装pip install mitmproxymitmproxy 是具有控制台界面的交互式,支持SSL的拦截代理mitmdump是mitmproxy的命令行版本。想想tcpdump为HTTPmitmweb 是一个基于web的界面,适用于mitmproxymitmproxy(mac)、mitmdump、mitmweb(win) 这三个命令中的任意一...

网络流(二)最大流的增广路算法

传送门:网络流(一)基础知识篇网络流(二)最大流的增广路算法网络流(三)最大流最小割定理网络流(四)dinic算法网络流(五)有上下限的最大流网络流(六)最小费用最大流问题转载:https://www.cnblogs.com/ZJUT-jiangnan/p/3632525.html 网络流的相关定义: 源点:有n个点,有m条有向边,有一个点很特殊,只出...

Python3自定义http/https请求拦截mitmproxy脚本

[本文出自天外归云的博客园] 脚本内容 代码如下: from mitmproxy importhttp, ctx from multiprocessing importLock classFilter: def __init__(self, filter_info): self.log_info = "" s...

SAP Material Flow System (MFS) 物料流系统简介

SAP Material Flow System (MFS) 物料流系统 MFS实现SAP EWM与自动化仓库设备进行数据交互,与设备PLC进行通迅, 上架 整托盘移动 拣货 Putback Conveying off the pick HU Diversion to clarification bin...