挑战程序设计3.5第3题dining

author author     2022-09-29     639

关键词:

题意:一个农场主有N头牛,现在要给牛喂吃的,喝的。但是没头牛都有它自己喜欢的食物

   和饮料。求最多能满足多少头牛的需求。(即:按照牛的意愿分配食物)

 

思路:这个题一看就是匹配问题(即:把食物和饮料与牛匹配起来),但这是1对2的匹配,所以肯定

   没法用二分图匹配算法来解题。但图的匹配问题可以用最大流来实现,从这题来看,可以将牛

   一分为二,一个与食物匹配,一个与饮料匹配,再将同一头牛匹配起来即可。

 

 1 #include <iostream>
 2 #include <string.h>
 3 #include <algorithm>
 4 #include <vector>
 5 using namespace std;
 6 
 7 int N, F, D;
 8 bool mapf[105][105], mapd[105][105];
 9 
10 
11 struct edge { 
12     int to, cap, rev;
13     edge(int a, int b, int c) :to(a), cap(b), rev(c) {}
14 };
15 
16 vector<edge> G[405];
17 bool vis[405];
18 
19 void add_edge(int from, int to, int cap) {    //建边及反向边
20     edge a(to, cap, G[to].size());
21     G[from].push_back(a);
22     edge b(from, 0, G[from].size() - 1);
23     G[to].push_back(b);
24 }
25 
26 int dfs(int v, int t, int f) {
27     if(v == t) return f;
28     vis[v] = true;
29     for (int i = 0; i < G[v].size(); i++) {
30         edge &e = G[v][i];
31         if (!vis[e.to] && e.cap > 0) {
32             int d = dfs(e.to, t, min(f, e.cap));
33             if (d > 0) {
34                 e.cap -= d;
35                 G[e.to][e.rev].cap += d;
36                 return d;
37             }
38         }
39     }
40     return 0;
41 }
42 
43 int max_flow(int s, int t) {
44     int flow = 0;
45     for (;;) {
46         memset(vis, 0, sizeof(vis));
47         int f = dfs(s, t, 1000);
48         if (f == 0)return flow;
49         flow += f;
50     }
51     return flow;
52 }
53 
54 void solve() {
55     int t = 0, s = 2 * N + F + D + 1;    
56     for (int i = 1; i <= F; i++) {  //建起点t与食物的边
57         add_edge(t, 2 * N + i, 1);
58     }
59     for (int i = 1; i <= D; i++) {  //建饮料与终点s的边
60         add_edge(2 * N + F + i, s, 1);
61     }
62     for (int i = 1; i <= N; i++) {//建牛的边及与食物和饮料的边
63         add_edge(i, N + i, 1);
64         for (int j = 1; j <= F; j++) {
65             if (mapf[j][i])add_edge(2 * N + j, i, 1);
66         }
67         for (int j = 1; j <= D; j++) {
68             if (mapd[i][j])add_edge(N + i, 2 * N + F + j, 1);
69         }
70     }
71     cout << max_flow(t, s) << endl;
72 }
73 
74 int main()
75 {
76     cin >> N >> F >> D;
77     memset(mapf, false, sizeof(mapf));
78     memset(mapd, false, sizeof(mapd));
79     for (int i = 1; i <= N; i++) {
80         int f, d;
81         cin >> f >> d;
82         for (int j = 0; j < f; j++) {
83             int a;
84             cin >> a;
85             mapf[a][i] = true;
86         }
87         for (int j = 0; j < d; j++) {
88             int a;
89             cin >> a;
90             mapd[i][a] = true;
91         }
92     }
93     solve();
94     return 0;
95 }

 

   

2021年科大讯飞猪只盘点挑战赛前三名队伍分享

文章目录1.第一名得迈科技1.1团队介绍1.2算法方案解析1.2.1数据噪声1.2.2数据预处理1.2.3数据增强1.2.4模型训练与改进1.2.5模型训练trick1.3改进与创新1.4优化思路2.第二名9vE1Mtxp5k2.1团队介绍2.2赛题目标2.3赛题挑战2.4算法设计 查看详情

阿里2014移动安全挑战赛第二题调试笔记

...近在学习安卓安全,看到52破解上面有分析2014年阿里安全挑战赛的第二个crackme的文章。勾起了我的回忆,那是我第一次参加安全比赛,在安卓安全也没有做多深入的学习。第一题比较简单,直接在logcat里面就可以看到输出的信... 查看详情

[poj]3281dining

原题题目大意N头奶牛,只能吃某种食物和饮料(而且只能吃特定的一份)一种食物被一头牛吃了之后,其余牛就不能吃了第一行有N,F,D三个整数接着2-N+1行代表第i头牛,前面两个整数是Fi与Di(食物与饮料的种类数量),接着是食物的种类与... 查看详情

2021年科大讯飞医疗实体及关系识别挑战赛前三名队伍分享

文章目录1.第一名Sayoulala1.1团队介绍1.2方案解析1.2.1赛题分析1.2.2方案选择1.2.3数据统计分析1.2.4方案框架1.3优化思路1.3.1待优化点1.3.2可尝试思路2.第二名五叶草2.1团队介绍2.2方案解析2.2.1赛题解析2.2.2模型设计 查看详情

acm-挑战题之排列生成(代码片段)

题目描述:挑战题之排列生成一自然数N,设N为3,则关于N的字典序排列为123,132,213,231,312,321。对于一个自然数N(1<=N<=9),你要做的便是生成它的字典序排列。输入第一行为自然数N。输出输出对应于N的字典序排列,每个排... 查看详情

2021年科大讯飞新冠肺炎声音诊断挑战赛前三名队伍分享

文章目录1.第一名UoWp2s4l01.1成员介绍1.2赛题简介1.3算法方案解析1.3.1问题分析1.3.2降维可视化1.3.3模型训练1.4优化思路2.第二名NWPU_BFZY2.1团队介绍2.2算法方案解析2.2.1赛题简介2.2.2数据统计2.2.3去静音2.2.4数据增强 查看详情

2021年科大讯飞高分子塑料桶贴画外观检测挑战赛前三名队伍分享

文章目录1.第一名Swangeese1.1团队介绍1.2赛题介绍1.3算法方案1.3.1算法概述1.3.2预处理1.3.3关键像素定位1.3.4后处理1.4总结2.第二名Onepiece2.1团队介绍2.2赛题简介2.3算法方案2.3.1整体架构2.3.2关键点定位2.3 查看详情

2020第6届中国大学生程序设计竞赛ccpc长春站,签到题3题(代码片段)

文章目录A.KryptonD.MeaninglessSequenceF.StrangeMemory补题链接:https://codeforces.com/gym/102832A.Kryptontimelimitpertest1secondmemorylimitpertest256megabytesinputstandardinputoutputstandardoutputInthef 查看详情

2020第6届中国大学生程序设计竞赛ccpc长春站,签到题3题(代码片段)

文章目录A.KryptonD.MeaninglessSequenceF.StrangeMemory补题链接:https://codeforces.com/gym/102832A.Kryptontimelimitpertest1secondmemorylimitpertest256megabytesinputstandardinputoutputstandardoutputInthef 查看详情

2021年中国高校大数据挑战赛-智能运维中的异常检测与趋势预测-a题思路(思路程序10.31更新)

2021年中国高校大数据挑战赛A题思路 2021年中国高校大数据挑战赛A题思路 2021年中国高校大数据挑战赛A题思路 2021年中国高校大数据挑战赛A题思路 2021年中国高校大数据挑战赛A题思路 2021年中国高校大数据挑战赛A题思路 2021... 查看详情

三周第二次课(12月26)3.4usermod命令3.5用户密码管理3.6mkpasswd命令

...令用来改变userid,必须确认这名user没在电脑上执行任何程序。你需手动更改使用者的crontab档。也需手动更改使用者的at工作档。采用NISse 查看详情

第46届国际大学生程序设计竞赛(icpc)亚洲区域赛(昆明),签到题3题(代码片段)

文章目录K.KingofGamersD.DivisionsF.FindtheMaximum补题链接:https://ac.nowcoder.com/acm/contest/32708K.KingofGamers链接:https://ac.nowcoder.com/acm/contest/32708/K来源:牛客网题目描述LittleGisgoingtopl 查看详情

[转]aoj0525osenbei《挑战程序设计竞赛(第2版)》练习题答案

来自 码农场 ? AOJ0525Osenbei《挑战程序设计竞赛(第2版)》练习题答案只把代码复制过来,原博的其他分析请看链接。1#include<iostream>2#include<bitset>3#include<algorithm>45usingnamespacestd;67bitset<10000>cookie 查看详情

[架构之路-15]:目标系统-硬件平台-什么是多核设计?多核面临的问题?什么是大小核设计?

...成2.1多核之间通信模型2.2多核的案例第3章多核处理器的挑战3.1程序执行问题3.2Cache一致性问题3.3核间互联3.4总线设计3.5操作系统设计3.6低功耗设计3.7存储器墙3.8可靠性及安全性设计3.9同构还是异构第4章大小核架构进步了解:... 查看详情

湖南省第6届程序设计大赛第一题汽水瓶

 题目A汽水瓶 有这样一道智力题:“某商店规定:三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?”答案是5瓶,方法如下:先用9个空瓶子换3瓶汽水,喝掉3瓶满的,喝完以... 查看详情

湖南省第6届程序大赛第3题数字整除

题目C数字整除 定理:把一个至少两位的正整数的个位数字去掉,再从余下的数中减去个位数的5倍。当且仅当差是17的倍数时,原数也是17的倍数。例如,34是17的倍数,因为3-20=-17是17的倍数;201不是17的倍数,因为20-5=15不是1... 查看详情

aizu2249roadconstruction单源最短路变形《挑战程序设计竞赛》模板题

KingMerceristhekingofACMkingdom.Thereareonecapitalandsomecitiesinhiskingdom.Amazingly,therearenoroadsinthekingdomnow.Recently,heplannedtoconstructroadsbetweenthecapitalandthecities,butitturnedoutthatt 查看详情

2020-2021年度第二届全国大学生算法设计与编程挑战赛(冬季赛)——正式赛(代码片段)

目录A题-塔B题-日记E题-神仙爱采药I题-奇怪的传输机增加了J题-奇怪的小鸭子也增加了K题-关于哥俩好的数字数字这件事A题-塔思路:签到题,26层,第i层先打印26-i个空格,然后正序和逆序打印字符,每一层换... 查看详情