当前位置: 首页 > news >正文

P2891 [USACO07OPEN] Dining G

P2891 [USACO07OPEN] Dining G

大意

每一个小朋友在得到自己喜欢的饮料和食物的时候,就实现了其愿望,问最多能实现多少奶牛的愿望。

思路

首先我们考虑这样的三元关系 \((饮料,小朋友,食物)\),这样的三元关系,如果我们直接在中间连边去跑最大流是否有问题呢?

显然是有问题的,如下图:

image

这样我们发现个奇怪的问题,一个小朋友对应的喜欢的食物和饮料其实是很多的,但是这样会使得不同的饮料与食物都对一个小朋友产生影响,现在我们需要做的是给一个点上约束,而这种技巧叫做拆点。

我们考虑将每个小朋友拆为 \(in\)\(out\),在 \(in\)\(out\) 间连容量为 \(1\) 的边,这样我们就可以保证每个小朋友只被算一次,如下图:

image

在拆完点之后直接跑最大流即可。

代码

#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
const int INF = 0x3f3f3f3f;
const int MAX_N = 1000;
const int MAX_M = 100000;
struct edge {int v, c, next;
} e[MAX_M];
int p[MAX_N], eid;
void init() {memset(p, -1, sizeof(p));eid = 0;
}
void insert(int u, int v, int c) {e[eid].v = v;e[eid].next = p[u];e[eid].c = c;p[u] = eid++;
}
void addedge(int u, int v, int c) {insert(u, v, c);insert(v, u, 0);
}
int S, T;
int d[MAX_N];
bool bfs() {memset(d, -1, sizeof(d));queue<int> q;q.push(S);d[S] = 0;while (!q.empty()) {int u = q.front();q.pop();for (int i = p[u]; i != -1; i = e[i].next) {int v = e[i].v;if (e[i].c > 0 && d[v] == -1) {q.push(v);d[v] = d[u] + 1;}}}return (d[T] != -1);
}
int dfs(int u, int flow) {if (u == T) {return flow;}int res = 0;for (int i = p[u]; i != -1; i = e[i].next) {int v = e[i].v;if (e[i].c > 0 && d[u] + 1 == d[v]) {int tmp = dfs(v, min(flow, e[i].c));flow -= tmp;e[i].c -= tmp;res += tmp;e[i ^ 1].c += tmp;if (flow == 0) {break;}}}if (res == 0) {d[u] = -1;}return res;
}
int Dinic() {int res = 0;while (bfs()) {res += dfs(S, INF);}return res;
}
int main() {init();int n, m, k;cin >> n >> m >> k;for(int i = 1;i <= n;i ++){addedge(m + i, m + n + i, 1);int a, b; cin >> a >> b;for(int j = 0;j < a;j ++){int x; cin >> x;addedge(x, m + i, 1);}for(int j = 0;j < b;j ++){int x; cin >> x;addedge(m + n + i, m + 2 * n + x, 1);}}S = 0; T = m + 2 * n + k + 1;for(int i = 1;i <= m;i ++){addedge(S, i, 1);}for(int i = 1;i <= k;i ++){addedge(m + 2 * n + i, T, 1);}cout << Dinic() << endl;return 0;
}
http://www.jsqmd.com/news/384099/

相关文章:

  • 2026年宝鸡管道疏通推荐:基于多场景实测评价,针对效率低下与安全隐忧精准指南 - 十大品牌推荐
  • 人工智能应用- 搜索引擎:02. 搜索引擎发展史
  • 2026年太原电脑售后维修点推荐:基于多品牌实测评价,针对兼容性与质量痛点精准指南 - 十大品牌推荐
  • 人工智能应用- 搜索引擎:01. 互联网时代
  • 消费者决策建模全解析:Python离散选择模型实战(2)
  • 建议收藏|风靡全网的一键生成论文工具 —— 千笔·专业论文写作工具
  • 管道疏通哪家靠谱?2026年包头管道疏通服务推荐与专业评价 - 十大品牌推荐
  • 2026年常州电脑售后维修点推荐:基于多品牌实测评价,针对数据安全与维修质量痛点精准指南 - 十大品牌推荐
  • 真心不骗你!AI论文平台 千笔 VS speedai,专为本科生量身打造!
  • 2026年青岛电脑售后维修点推荐:基于多品牌实测评价,针对数据安全与维修质量痛点精准指南 - 十大品牌推荐
  • 2026年全球医疗行业趋势研究报告:AI医疗、创新药与医疗器械|附240+份报告PDF、素材、可视化模板汇总下载
  • 2026年福州电脑售后维修点推荐:基于多品牌兼容性评价,针对数据安全与维修质量痛点指南分析 - 十大品牌推荐
  • 2026年太原电脑售后维修点推荐:基于多品牌实测评价,针对数据安全与响应慢痛点精准指南 - 十大品牌推荐
  • 2026年青岛电脑售后维修点推荐:基于多品牌实测评价,针对维修质量与时效痛点精准指南 - 十大品牌推荐
  • 2026年宁波电脑售后维修点推荐:基于多品牌实测评价,针对数据安全与维修质量痛点 - 十大品牌推荐
  • 2026年杭州电脑售后维修点推荐:基于多品牌兼容性评价,针对紧急维修与数据安全痛点 - 十大品牌推荐
  • 2026年福州电脑售后维修点推荐:基于多品牌兼容性评价,针对数据安全与维修质量痛点指南 - 十大品牌推荐
  • 电脑维修点哪个靠谱?2026年贵阳电脑售后维修点推荐与排名,解决响应与质保核心痛点 - 十大品牌推荐
  • 2026年宁波电脑售后维修点推荐:基于多品牌实测评价,针对数据安全与兼容性痛点精准指南 - 十大品牌推荐
  • 企业电脑多品牌如何维护?2026年杭州电脑售后维修点推荐与排名,解决统一服务与快速响应核心痛点 - 十大品牌推荐
  • 2026年郑州电脑售后维修点推荐:长期可靠性趋势评测,涵盖应急与日常维护核心场景痛点 - 十大品牌推荐
  • 2026年贵阳电脑售后维修点推荐:办公居家场景深度评测,解决响应慢与配件痛点并附排名 - 十大品牌推荐
  • 2026年郑州电脑售后维修点推荐:基于多品牌实测评价,针对兼容性与时效痛点精准指南 - 十大品牌推荐
  • 2026年北京电脑售后维修点推荐:基于多品牌兼容性评价,针对数据安全与效率痛点 - 十大品牌推荐
  • 2026年大连电脑售后维修点推荐:办公居家场景深度评测,解决故障响应慢与配件不透明痛点 - 十大品牌推荐
  • 2026年苏州电脑售后维修点推荐:本地化服务趋势评测,涵盖紧急与日常场景维修核心痛点 - 十大品牌推荐
  • 电脑维修点哪家靠谱?2026年北京电脑售后维修点推荐与排名,解决时效性与配件原装核心痛点 - 十大品牌推荐
  • 2026年大连电脑售后维修点推荐:专业服务趋势评测,涵盖应急与日常维护场景核心痛点 - 十大品牌推荐
  • 2026年济南电脑售后维修点推荐:基于多品牌实测评价,针对数据安全与兼容性痛点精准指南 - 十大品牌推荐
  • 2026改性沥青防水涂料厂家推荐排行榜产能与专利双领先 - 爱采购寻源宝典