博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【洛谷1231】 教辅的组成(网络流)
阅读量:6289 次
发布时间:2019-06-22

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

传送门

Solution

考虑一本书最多用一次,所以拆点。

其他的答案、练习册与书本的限制直接连1的边就好了。
最后跑出来的最大流就是答案。

代码实现

#include
using namespace std;const int N=100010,Inf=1e9+10;int front[N],cnt,s,t,n1,n2,n3;struct node{ int to,nxt,w;}e[500010];queue
Q;int dep[N];void Add(int u,int v,int w){ e[cnt]=(node){v,front[u],w};front[u]=cnt++; e[cnt]=(node){u,front[v],0};front[v]=cnt++;}bool bfs(){ memset(dep,0,sizeof(dep)); Q.push(s);dep[s]=1; while(!Q.empty()) { int u=Q.front();Q.pop(); for(int i=front[u];i!=-1;i=e[i].nxt) { int v=e[i].to; if(!dep[v] && e[i].w) { dep[v]=dep[u]+1;Q.push(v); } } } return dep[t];}int dfs(int u,int flow){ if(u==t || !flow)return flow; for(int i=front[u];i!=-1;i=e[i].nxt) { int v=e[i].to; if(dep[v]==dep[u]+1 && e[i].w) { int di=dfs(v,min(flow,e[i].w)); if(di) { e[i].w-=di;e[i^1].w+=di; return di; } else dep[v]=0; } } return 0;}int dinic(){ int flow=0; while(bfs()) { while(int d=dfs(s,Inf))flow+=d; } return flow;}int m;int main(){ memset(front,-1,sizeof(front)); scanf("%d%d%d",&n1,&n2,&n3);t=n1*2+n2+n3+1; scanf("%d",&m); for(int i=1;i<=n2;i++) Add(s,i,1); for(int i=1;i<=n1;i++) Add(i+n2,i+n1+n2+n3,1); while(m--) { int x,y;scanf("%d%d",&x,&y); Add(y,x+n2,1); } scanf("%d",&m); for(int i=1;i<=n3;i++) Add(i+n1+n2,t,1); while(m--) { int x,y;scanf("%d%d",&x,&y); Add(n1+n2+n3+x,y+n1+n2,1); } printf("%d\n",dinic()); return 0;}

转载于:https://www.cnblogs.com/mle-world/p/10549680.html

你可能感兴趣的文章
写给0-3岁产品经理的12封信(第08篇)——产品运营能力
查看>>
ArcGIS Engine 符号自动化配置工具实现
查看>>
小程序 · 跳转带参数写法,兼容url的出错
查看>>
flutter error
查看>>
Flask框架从入门到精通之模型数据库配置(十一)
查看>>
10年重新出发
查看>>
2019年-年终总结
查看>>
聊聊elasticsearch的RoutingService
查看>>
让人抓头的Java并发(一) 轻松认识多线程
查看>>
从源码剖析useState的执行过程
查看>>
地包天如何矫正?
查看>>
中间件
查看>>
Android SharedPreferences
查看>>
css面试题
查看>>
Vue组建通信
查看>>
用CSS画一个带阴影的三角形
查看>>
前端Vue:函数式组件
查看>>
程鑫峰:1.26特朗.普力挺美元力挽狂澜,伦敦金行情分析
查看>>
safari下video标签无法播放视频的问题
查看>>
01 iOS中UISearchBar 如何更改背景颜色,如何去掉两条黑线
查看>>