博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj3281Dining——网络流匹配
阅读量:5286 次
发布时间:2019-06-14

本文共 1921 字,大约阅读时间需要 6 分钟。

题目:

网络流做图中的匹配,注意为了限制每头牛只匹配一种食物和一种饮料,要把牛拆成两个点,之间连边权为1的边。

代码如下:

#include
#include
#include
#include
using namespace std;queue
q;int n,f,d,head[505],ct=1,inf=1e9,cur[505],ans,dep[505],t;struct N{ int to,next,w; N(int t=0,int n=0,int ww=0):to(t),next(n),w(ww) {}}edge[50005];void add(int x,int y){ edge[++ct]=N(y,head[x],1);head[x]=ct; edge[++ct]=N(x,head[y],0);head[y]=ct;}bool bfs(){ memset(dep,0,sizeof dep); while(q.size())q.pop(); q.push(0);dep[0]=1; while(q.size()) { int x=q.front();q.pop(); for(int i=head[x];i;i=edge[i].next) { int u=edge[i].to; if(!dep[u]&&edge[i].w) { dep[u]=dep[x]+1; q.push(u); } } } return dep[t];}int dfs(int x,int f){ if(x==t)return f;// int res=0; for(int i=cur[x];i;i=edge[i].next) { int u=edge[i].to; if(dep[u]==dep[x]+1&&edge[i].w) { int tmp=dfs(u,min(edge[i].w,f-res)); edge[i].w-=tmp; edge[i^1].w+=tmp; res+=tmp; if(edge[i].w)cur[x]=i; if(res==f)return f; } } if(res==0)dep[x]=0; return res;}int main(){ scanf("%d%d%d",&n,&f,&d); t=2*n+f+d+1; for(int i=1;i<=f;i++) add(0,i); for(int i=1;i<=n;i++) { int x,y,dc; scanf("%d%d",&x,&y); for(int j=1;j<=x;j++) { scanf("%d",&dc); add(dc,i+f); } add(i+f,i+n+f); for(int j=1;j<=y;j++) { scanf("%d",&dc); add(i+n+f,dc+2*n+f); } } for(int i=1;i<=d;i++) add(i+2*n+f,t); while(bfs()) { for(int i=0;i<=t;i++)cur[i]=head[i]; ans+=dfs(0,inf); } printf("%d",ans); return 0;}

 

转载于:https://www.cnblogs.com/Zinn/p/8613518.html

你可能感兴趣的文章
Linux误删恢复
查看>>
Unity调用Windows窗口句柄,选择文件和目录
查看>>
HashMap循环遍历方式
查看>>
React Native 入门 调试项目
查看>>
C# 通过 Quartz .NET 实现 schedule job 的处理
查看>>
关于java之socket输入流输出流可否放在不同的线程里进行处理
查看>>
目前为止用过的最好的Json互转工具类ConvertJson
查看>>
Day13
查看>>
tensorflow saver简介+Demo with linear-model
查看>>
Luogu_4103 [HEOI2014]大工程
查看>>
Oracle——SQL基础
查看>>
项目置顶随笔
查看>>
Redis的安装与使用
查看>>
P1970 花匠
查看>>
NOIP2016提高A组五校联考2总结
查看>>
iOS 项目的编译速度提高
查看>>
table中checkbox选择多行
查看>>
Magento开发文档(三):Magento控制器
查看>>
性能调优攻略
查看>>
ie6解决png图片透明问题
查看>>