BZOJ 1458: 士兵占领 最大流

本文深入探讨了最大流算法的实现细节,包括基于Ford-Fulkerson算法的增广路径寻找与更新流程,并通过具体代码示例展示了如何在C++中实现这一算法。此外,还讨论了算法在解决复杂网络流问题中的应用。

code: 

#include <cstdio> 
#include <queue>
#include <algorithm> 
#include <cstring>  
#include <vector>
#define N 302   
#define inf 10005 
#define setIO(s) freopen(s".in","r",stdin) 
using namespace std;   
int s,t; 
int vis[N]; 
int d[N]; 
int gr[N][N]; 
int M[N],a[N],b[N];             
struct Edge { 
    int u,v,c; 
    Edge(int u=0,int v=0,int c=0):u(u),v(v),c(c){}  
}; 
queue<int>q;  
vector<Edge>edges;   
vector<int>G[N];  
void add(int u,int v,int c) {
    edges.push_back(Edge(u,v,c)); 
    edges.push_back(Edge(v,u,0));   
    int o=edges.size();   
    G[u].push_back(o-2); 
    G[v].push_back(o-1);       
}     
int dfs(int x,int cur) {  
    if(x==t) return cur;   
    int an=0,flow=0; 
    for(int i=0;i<G[x].size();++i) {
        Edge e=edges[G[x][i]];   
        if(e.c>0&&d[e.v]==d[x]+1) {      
            an=dfs(e.v,min(cur,e.c));    
            if(an) {
                cur-=an; 
                flow+=an;             
                edges[G[x][i]].c-=an; 
                edges[G[x][i]^1].c+=an;     
                if(!cur) break;    
            } 
        }
    }
    return flow;  
}
int bfs() {    
    memset(vis,0,sizeof(vis)); 
    d[s]=0; 
    vis[s]=1; 
    q.push(s); 
    while(!q.empty()) {
        int u=q.front(); 
        q.pop();  
        for(int i=0;i<G[u].size();++i) {
            if(edges[G[u][i]].c>0) {
                int v=edges[G[u][i]].v;   
                if(!vis[v]) {
                    vis[v]=1; 
                    d[v]=d[u]+1;   
                    q.push(v);   
                }
            }
        }
    } 
    return vis[t];  
}    
int maxflow() { 
    int re=0; 
    while(bfs()) {
        re+=dfs(s,inf);   
    } 
    return re; 
}
int main() { 
    // setIO("input");         
    int i,j,n,m,k;      
    scanf("%d%d%d",&n,&m,&k);      
    for(i=1;i<=n;++i)  scanf("%d",&a[i]); 
    for(i=1;i<=m;++i)  scanf("%d",&b[i]);  
    for(i=1;i<=k;++i) {
        int x,y; 
        scanf("%d%d",&x,&y);         
        gr[y][x]=1;      
    }
    for(i=1;i<=n;++i) { 
        int re=0; 
        for(j=1;j<=m;++j) { 
            re+=gr[i][j];  
        }   
        M[i]=m-re-a[i];   
    }   
    for(i=1;i<=m;++i) {
        int re=0; 
        for(j=1;j<=n;++j) {
            re+=gr[j][i];  
        }
        M[i+n]=n-re-b[i];   
    }
    for(i=1;i<=n+m;++i)  {
        if(M[i]<0)   {
            printf("JIONG!\n"); 
            return 0; 
        }
    } 
    s=0,t=n+m+1;  
    for(i=1;i<=n;++i) {      
        add(s,i,M[i]);   
        for(j=n+1;j<=n+m;++j) {
            add(i,j,1);   
        }
    }    
    for(i=n+1;i<=n+m;++i) {
        add(i,t,M[i]);  
    }   
    printf("%d\n",m*n-k-maxflow());   
    return 0; 
}

  

根据原作 https://pan.quark.cn/s/0ed355622f0f 的源码改编 野火IM解决方案 野火IM是专业级即时通讯和实时音视频整体解决方案,由北京野火无限网络科技有限公司维护和支持。 主要特性有:私有部署安全可靠,性能强大,功能齐全,全平台支持,开源率高,部署运维简单,二次开发友好,方便与第三方系统对接或者嵌入现有系统中。 详细情况请参考在线文档。 主要包括一下项目: 野火IM Vue Electron Demo,演示如何将野火IM的能力集成到Vue Electron项目。 前置说明 本项目所使用的是需要付费的,价格请参考费用详情 支持试用,具体请看试用说明 本项目默认只能连接到官方服务,购买或申请试用之后,替换,即可连到自行部署的服务 分支说明 :基于开发,是未来的开发重心 :基于开发,进入维护模式,不再开发新功能,鉴于已经终止支持且不再维护,建议客户升级到版本 环境依赖 mac系统 最新版本的Xcode nodejs v18.19.0 npm v10.2.3 python 2.7.x git npm install -g node-gyp@8.3.0 windows系统 nodejs v18.19.0 python 2.7.x git npm 6.14.15 npm install --global --vs2019 --production windows-build-tools 本步安装windows开发环境的安装内容较多,如果网络情况不好可能需要等较长时间,选择早上网络较好时安装是个好的选择 或参考手动安装 windows-build-tools进行安装 npm install -g node-gyp@8.3.0 linux系统 nodej...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值