【loj】#6006. 「网络流 24 题」试题库(二分图匹配)
来源:互联网 发布:淘宝玻璃钢化粪罐 编辑:程序博客网 时间:2024/06/05 15:11
记录一个菜逼的成长。。
题目链接
这题跟前面那到圆桌聚餐差不多。
#include <bits/stdc++.h>using namespace std;#define rep(i,l,r) for( int i = l; i <= r; i++ )#define rep0(i,l,r) for( int i = l; i < r; i++ )#define ALL(v) (v).begin(),(v).end()#define cl(a,b) memset(a,b,sizeof(a))#define clr clear()#define pb push_back#define mp make_pair#define fi first#define se secondtypedef long long LL;typedef pair<int,int> PII;const int INF = 0x3f3f3f3f;const int MAX_V = 2000 + 10;struct edge{ int to,cap,rev,flow; edge(){} edge(int _to,int _cap,int _rev,int _flow):to(_to),cap(_cap),rev(_rev),flow(_flow){}};vector<edge>G[MAX_V];int level[MAX_V];int iter[MAX_V];void add(int from,int to,int cap,int flow = 0){ G[from].push_back(edge(to,cap,G[to].size(),0)); G[to].push_back(edge(from,0,G[from].size()-1,0));}void bfs(int s){ memset(level,-1,sizeof(level)); queue<int>que; level[s] = 0; que.push(s); while(!que.empty()){ int f = que.front(); que.pop(); for( int i = 0; i < G[f].size(); i++ ){ edge &e = G[f][i]; if(e.cap > 0 && level[e.to] == -1){ level[e.to] = level[f] + 1; que.push(e.to); } } }}int dfs(int v,int t,int f){ if(v == t)return f; for( int &i = iter[v]; i < G[v].size(); i++ ){ edge &e = G[v][i]; if(e.cap > 0 && level[v] < level[e.to]){ int d = dfs(e.to,t,min(e.cap,f)); if(d > 0){ e.cap -= d;e.flow += d; G[e.to][e.rev].cap += d; return d; } } } return 0;}int max_flow(int s,int t){ int flow = 0; for(;;){ bfs(s); if(level[t] == -1)return flow; memset(iter,0,sizeof(iter)); int f; while((f = dfs(s,t,INF)) > 0) flow += f; }}int main(){ int k,n; scanf("%d%d",&k,&n); int s = 0,t = n + k + 1,sum = 0; rep(i,1,k){ int x;scanf("%d",&x);sum += x; add(i+n,t,x); } rep(i,1,n){ int p;scanf("%d",&p); rep(j,1,p){ int x;scanf("%d",&x); add(i,x+n,1); } } rep(i,1,n){ add(s,i,1); } int ret = max_flow(s,t); if(ret < sum){ puts("No Solution!"); return 0; } vector<int>a[MAX_V]; rep(i,1,n){ for( int j = 0; j < G[i].size(); j++ ){ if(G[i][j].to > n && G[i][j].cap == 0){ a[G[i][j].to-n].pb(i); } } } rep(i,1,k){ printf("%d: ",i); for( int j = 0; j < a[i].size(); j++ ){ printf("%d ",a[i][j]); } puts(""); } return 0;}
阅读全文
0 0
- 【loj】#6006. 「网络流 24 题」试题库(二分图匹配)
- 【loj】#6000. 「网络流 24 题」搭配飞行员(二分图匹配)
- 【loj】#6004. 「网络流 24 题」圆桌聚餐(二分图匹配)
- loj #6003. 「网络流 24 题」魔术球(二分匹配 优化建图)
- loj #6002. 「网络流 24 题」最小路径覆盖(二分匹配)
- 线性规划与网络流24题の7 试题库问题(二分图匹配)
- 【网络流24题】试题库(二分图+最大流)
- Cogs 732. [网络流24题] 试题库(二分图)
- 【网络流二十四题 试题库问题】【二分图多重匹配->最大流】
- 「网络流 24 题」试题库
- 「网络流 24 题」试题库
- 【LOJ】6002 「网络流 24 题」最小路径覆盖 二分图
- 【loj】#6007. 「网络流 24 题」方格取数(二分图最大点权独立集)
- [Loj] #6000. 「网络流 24 题」搭配飞行员
- [Loj]#6001. 「网络流 24 题」太空飞行计划
- [Loj]#6003. 「网络流 24 题」魔术球
- [Loj]#6004. 「网络流 24 题」圆桌聚餐
- LOJ #6006. 试题库 (简单最大流+输出可行路径)
- 30分钟搭建Java后端开发环境
- 表的垂直拆分和水平拆分
- 最大公约数与最小公倍数(gcd,lcm)
- Original error: Could not transfer artifact org.apache.maven.plugins:maven-surefire-plugin:pom:2.7.1
- linux命令---pidstat
- 【loj】#6006. 「网络流 24 题」试题库(二分图匹配)
- web中 checkbox的全选
- 设置导航栏选中状态
- 一篇很好的grunt博客
- poj 3061 Subsequence【简单尺取】
- 集电极开路、漏极开路、上拉电阻、下拉电阻等接口相关基本概念
- ACE的陷阱
- 最小生成树:HDU1863-畅通工程
- Java中的引用类型