首页 > 其他分享 >网络流 - 最大流 学习心得

网络流 - 最大流 学习心得

时间:2023-10-13 14:46:17浏览次数:47  
标签:fir 最大 int 学习心得 网络 tot bfs bug define

一篇写的很好的博客

那篇博客讲得很清楚,就不再赘述了。在这里贴出一些我犯过的 bug :

/*  
  bug:1.是q.front()而不是q.back()  
      2.q需要pop()  
      3.bfs的条件不是w!=0而是w>0  
      4.flow不会在同一层被更新,因此不能给flow赋值  
      5.一次bfs可以dinic多次  
      6.w数组的索引是e而不是u或者x!!!  
 */  
#include<bits/stdc++.h>  
using namespace std;  
#define N 1005  
#define M 5005  
#define inf 0x3f3f3f3f  
int tot=1,fir[N],nxt[M],to[M],w[M];  
int S,T;  
int nl,nr,m,n;  
void add(int x,int y,int z){  
    nxt[++tot]=fir[x];  
    fir[x]=tot;  
    to[tot]=y;  
    w[tot]=z;  
}  
int dep[N],cur[N],ans;  
int firstPoint,lastPoint;  
bool bfs(){  
    for(int i=firstPoint;i<=lastPoint;++i)dep[i]=inf;  
    queue<int>q;  
    q.push(S);  
    dep[S]=0;  
    while(!q.empty()){  
        int x=q.front();        //bug #1  
        q.pop();                //bug #2  
        for(int e=fir[x];e;e=nxt[e]){  
            int u=to[e];  
            if(w[e]<=0||dep[u]!=inf)continue;//bug #3 #6  
            dep[u]=dep[x]+1;  
            q.push(u);  
            if(u==T)return 1;  
        }  
    }  
    return 0;  
}  
int dinic(int x,int flow){  
    if(x==T)return flow;  
    int totf=0;  
    for(int e=fir[x];e;e=nxt[e]){  
        int u=to[e];  
        if(dep[u]!=dep[x]+1||w[e]<=0)continue;  
        int newf=dinic(u,min(flow,w[e]));    //bug #4  
        if(newf==0){  
            dep[u]=inf;  
            continue;  
        }  
        w[e]-=newf;  
        w[e^1]+=newf;  
        totf+=newf;  
        flow-=newf;  
        if(flow==0)return totf;  
    }  
    return totf;  
}  
int main(){  
    int x,y,z;  
    scanf("%d %d %d",&m,&nl,&nr);  
    for(int i=1;i<=m;++i){  
        scanf("%d %d",&x,&y);  
        y+=nl;  
        add(x,y,1);  
        add(y,x,0);  
    }  
    S=nl+nr+1,T=nl+nr+2;  
    firstPoint=1,lastPoint=T+1;  
    for(int i=1;i<=nl;++i){  
        add(S,i,1);  
        add(i,S,0);  
    }  
    for(int i=nl+1;i<S;++i){  
        add(i,T,1);  
        add(T,i,0);  
    }  
    while(bfs()){  
        ans+=dinic(S,inf);  
    }  
    printf("%d\n",ans);  
    return 0;  
}

标签:fir,最大,int,学习心得,网络,tot,bfs,bug,define
From: https://www.cnblogs.com/DZhearMins/p/17762055.html

相关文章

  • 树链剖分 学习心得
    Bug都写在代码开头了,就不复述了。还有一个智障的错误是注释调试代码的时候把同一行的正式代码也给注释掉了(写得非常精彩。/*  bug:1.rev、id要分清!      2.mod()函数的情况不能写一半就跑路!      3.别忘了先给tree build()一下!      4.出界......
  • 数位 dp 学习心得
    感觉非常牛逼。最牛逼的是很多情况下要去掉前导零。去掉前导零的方法通常是先忽略前导零的约束,最后再容斥掉有多少0。LuoguP2602数字计数来自【详细解释】数字计数ZJOJp2602一道练习数位DP的好题-moye到碗里来的博客-洛谷博客(luogu.com.cn)那么我们首先看题,对于这......
  • 割边+割点 学习心得
    先背诵tarjan板子#include<bits/stdc++.h>using namespace std;#define N 10005#define M 100005int tot,first[N],nxt[M],to[M];void add(int x,int y){    nxt[++tot]=first[x];    first[x]=tot;    to[tot]=y;}int n......
  • CentOS 7 配置网络(虚拟机)
    确认虚拟机NAT网段可以从图中看出,VMnet8网络的IP段是192.168.11.0,掩码255.255.255.0,网关192.168.11.2。编辑网络配置文件网络配置文件地址:/etc/sysconfig/network-scripts/编辑ifcfg-ens33文件:vim/etc/sysconfig/network-scripts/ifcfg-ens33重新启动网络服务命令:syste......
  • 高效网络通信技术揭秘,Socket原理与实践
    Socket(套接字)是一种在计算机网络中进行通信的抽象概念。它提供了一种编程接口,使得应用程序能够通过网络进行数据交换。Socket可以在不同的计算机上的进程之间建立连接,实现数据的传输和通信。Socket是一个端点,由IP地址和端口号组成。IP地址指示计算机的位置,而端口号则指定......
  • 关于网络协议的若干问题(三)
    1、当发送的报文出问题的时候,会发送一个ICMP的差错报文来报告错误,但是如果ICMP的差错报文也出问题了呢?答:不会导致产生ICMP差错报文的有:ICMP差错报文(ICMP查询报文可能会产生ICMP差错报文);目的地址是广播地址或多播地址的IP数据报;作为链路层广播的数据报;不是IP分片的第......
  • 网络规划设计师真题解析--TCP慢启动拥塞避免机制取值问题
    若TCP最大段长为1000字节,在建立连接后慢启动,第1轮次发送了1个段并收到了应答,应答报文中window字段为5000字节,此时还能发送(25)字节。(2019年)(25)A.1000    B.2000     C.3000     D.5000答案:B解析:假如TCP最大段长为1000字节,在建立连接后慢启动第1轮发送了1个段......
  • socket网络编程
    Socket网络编程一、计算机网络概述1、IP地址的概念IP地址就是标识网络中设备的一个地址,好比现实生活中的家庭住址。网络设备的效果图:2、IP地址的表现形式说明:IP地址分为两类:IPv4和IPv6IPv4是目前使用的IP地址IPv6是未来使用的IP地址IPv4是由点分十进制组成IPv6是......
  • 网络问题排查
          ......
  • 树上的最大权连通块:一种换根动态规划与贪心算法的结合
    树上的最大权连通块:一种换根动态规划与贪心算法的结合在计算机科学中,树是一种非常特殊的数据结构,不仅因为它们在存储数据时的效率,还因为它们提供了一种非常直观且强大的方式来解决各种问题。今天,我们将探讨一种特殊类型的问题,即在一棵树中找到一个特殊的子集或连通块,该子集中的节......