POJ3281——Dining(最大流)

本文深入讲解网络流算法在网络连接优化中的应用,通过实例演示如何利用该算法确保所有食物和饮料节点与牛节点的有效连接,同时确保每头牛仅被计算一次。文章提供了详细的代码实现,包括节点设置、边的添加、最大流的计算等关键步骤。

传送门

很简单的一个网络流

为了保证所有的食物和饮料都和牛连上

把牛放在中间

为了保证所有的牛都只被算一次

每个牛作两个点,中间连一条容量为1的边

跑最大流就可以了

#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<queue>
#include<cstdlib>
#include<cstring>
#include<string.h>
#include<cmath>
#include<math.h>
using namespace std;
int adj[100005],nxt[100005],to[100005],cap[100050],lev[100005],n,str,des,cnt=1,f,d;
inline int read(){
    char ch=getchar();
    int res=0;
    while(!isdigit(ch)) ch=getchar();
    while(isdigit(ch)) res=(res<<1)+(res<<3)+(ch^48),ch=getchar();
    return res;
}
inline void addedge(int u,int v,int w)
{
    nxt[++cnt]=adj[u],adj[u]=cnt,to[cnt]=v,cap[cnt]=w;
    nxt[++cnt]=adj[v];adj[v]=cnt,to[cnt]=u,cap[cnt]=0;
} 
inline bool bfs(){
    queue<int>q;int v;
    memset(lev,-1,sizeof(lev));
    q.push(str),lev[str]=0;
    while(!q.empty())
    {
        int u=q.front();q.pop();
        for(int e=adj[u];e;e=nxt[e])
        {
            if(cap[e]>0&&lev[v=to[e]]==-1)
            {
                lev[v]=lev[u]+1,q.push(v);
                if(v==des)    return true;
            }
        }
    }
    return false;
}
inline int dfs(int u,int flow)
{
    if(u==des)return flow;
    int res=0,v,flw;
    for(int e=adj[u];e;e=nxt[e])
    {
        if(cap[e]>0&&lev[u]<lev[v=to[e]])
        {
            flw=dfs(v,min(cap[e],flow-res));
            if(flw==0) lev[v]=-1;
            cap[e]-=flw,cap[e^1]+=flw;
            res+=flw;if(res==flow) break;
        }
    }
    return res;
}
inline int dinic(){
    int ans=0;
    while(bfs())ans+=dfs(str,1<<30);
    return ans;
}
int main(){
    n=read(),f=read(),d=read();
    for(int i=1;i<=f;i++)
    addedge(1,i+1,1);
    int dr,fo;
    str=1,des=1+f+2*n+d+1;
    for(int i=1;i<=n;i++)
    {
        fo=read(),dr=read();
        for(int j=1;j<=fo;j++)
        {
            int fd=read();
            addedge(fd+1,f+1+i,1);
        }
        for(int j=1;j<=dr;j++)
        {
            int dk=read();
            addedge(f+n+1+i,2*n+f+1+dk,1);
        }
    }
    for(int i=f+1+1;i<=f+1+n;i++)
    {
        addedge(i,i+n,1);
    }
    for(int i=f+2*n+1+1;i<=2*n+f+1+d;i++)
    {
        addedge(i,des,1);
    }
    cout<<dinic()<<endl;
    return 0;
}

转载于:https://www.cnblogs.com/stargazer-cyk/p/10366485.html

乐播投屏是一款简单好用、功能强大的专业投屏软件,支持手机投屏电视、手机投电脑、电脑投电视等多种投屏方式。 多端兼容与跨网投屏:支持手机、平板、电脑等多种设备之间的自由组合投屏,且无需连接 WiFi,通过跨屏技术打破网络限制,扫一扫即可投屏。 广泛的应用支持:支持 10000+APP 投屏,包括综合视频、网盘与浏览器、美韩剧、斗鱼、虎牙等直播平台,还能将央视、湖南卫视等各大卫视的直播内容一键投屏。 高清流畅投屏体验:腾讯独家智能音画调校技术,支持 4K 高清画质、240Hz 超高帧率,低延迟不卡顿,能为用户提供更高清、流畅的视觉享受。 会议办公功能强大:拥有全球唯一的 “超级投屏空间”,扫码即投,无需安装。支持多人共享投屏、远程协作批注,PPT、Excel、视频等文件都能流畅展示,还具备企业级安全加密,保障会议资料不泄露。 多人互动功能:支持多人投屏,邀请好友加入投屏互动,远程也可加入。同时具备一屏多显、语音互动功能,支持多人连麦,实时语音交流。 文件支持全面:支持 PPT、PDF、Word、Excel 等办公文件,以及视频、图片等多种类型文件的投屏,还支持网盘直投,无需下载和转格式。 特色功能丰富:投屏时可同步录制投屏画面,部分版本还支持通过触控屏或电视端外接鼠标反控电脑,以及在投屏过程中用画笔实时标注等功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值