HDU 4292 Food 多源多汇入门题
有F种食物和D种饮料,每种食物或饮料只能供有限次,且每个人只享用一种食物和一种饮料。现在有n个人,每个人都有自己喜欢的食物种类列表和饮料种类列表,问最多能使几个人同时享用到自己喜欢的食物和饮料。
邻接矩阵 DINIC 在定点数较多的时候比较慢。time 608 ms 。邻接表可以加速
1 #include <iostream>
2 #include <cstdio>
3 #include <cstring>
4 #include <cmath>
5 #include <algorithm>
6 #include <string>
7 #include <vector>
8 #include <set>
9 #include <map>
10 #include <stack>
11 #include <queue>
12 #include <sstream>
13 #include <iomanip>
14 using namespace std;
15 typedef long long LL;
16 const int INF = 0x4fffffff;
17 const double EXP = 1e-5;
18 const int MS = 205;
19 const int SIZE = 100005;
20
21 int edges[4*MS][4*MS];
22 int level[4*MS];
23 int que[6*MS];
24 char str[MS];
25 int qs,qe;
26 int n,f,d,cnt;
27
28 bool BFS()
29 {
30 memset(level,0xff,sizeof(level));
31 level[0]=0;
32 qs=qe=0;
33 que[qe++]=0;
34 while(qs<qe)
35 {
36 int u=que[qs++];
37 for(int v=0;v<=cnt;v++)
38 {
39 if(level[v]<0&&edges[u][v]>0)
40 {
41 level[v]=level[u]+1;
42 que[qe++]=v;
43 }
44 }
45 }
46 return level[cnt]>0;
47 }
48
49 int DFS(int u,int minv)
50 {
51 if(u==cnt)
52 return minv;
53 int t;
54 for(int v=0;v<=cnt;v++)
55 {
56 if(edges[u][v]>0&&level[v]==level[u]+1&&(t=DFS(v,min(minv,edges[u][v]))))
57 {
58 edges[u][v]-=t;
59 edges[v][u]+=t;
60 return t;
61 }
62 }
63 level[u]=0xff;
64 return 0;
65 }
66
67 int main()
68 {
69 while(scanf("%d%d%d",&n,&f,&d)!=EOF)
70 {
71 memset(edges,0,sizeof(edges));
72 int w;
73 for(int i=1;i<=f;i++)
74 {
75 scanf("%d",&w);
76 edges[0][i]=w;
77 }
78 // 0 1--> f, f+1--->f+n, f+n+1 --> f+2*n f+2*n+1-->f+2*n+d f+2*n+d+1;
79 for(int i=1;i<=n;i++)
80 edges[f+i][f+n+i]=1;
81 cnt=f+2*n+d+1;
82 for(int i=1;i<=d;i++)
83 {
84 scanf("%d",&w);
85 edges[f+2*n+i][cnt]=w;
86 }
87 for(int i=1;i<=n;i++)
88 {
89 scanf("%s",str);
90 for(int j=0;j<f;j++)
91 {
92 if(str[j]=='Y')
93 {
94 edges[j+1][f+i]=1;
95 }
96 }
97 }
98
99 for(int i=1;i<=n;i++)
100 {
101 scanf("%s",str);
102 for(int j=0;j<d;j++)
103 {
104 if(str[j]=='Y')
105 {
106 edges[f+n+i][f+2*n+j+1]=1;
107 }
108 }
109 }
110 int ans=0;
111 int t;
112 while(BFS())
113 {
114 while(t=DFS(0,INF))
115 {
116 ans+=t;
117 }
118 }
119 printf("%d\n",ans);
120 }
121 return 0;
122 }
time 124ms
1 #include <iostream>
2 #include <cstdio>
3 #include <cstring>
4 #include <cmath>
5 #include <algorithm>
6 #include <string>
7 #include <vector>
8 #include <set>
9 #include <map>
10 #include <stack>
11 #include <queue>
12 #include <sstream>
13 #include <iomanip>
14 using namespace std;
15 typedef long long LL;
16 const int INF = 0x4fffffff;
17 const double EXP = 1e-5;
18 const int MS = 805;
19 const int SIZE = 200005;
20
21
22 struct edge
23 {
24 int v,w,next;
25 }edges[SIZE];
26
27 int head[MS];
28 int level[MS];
29 int que[MS];
30 int qs,qe,cnt;
31 int n,f,d;
32 int src,des;
33
34 void add(int u,int v,int w)
35 {
36 edges[cnt].v=v;edges[cnt].w=w;edges[cnt].next=head[u];head[u]=cnt++;
37 edges[cnt].v=u;edges[cnt].w=0;edges[cnt].next=head[v];head[v]=cnt++;
38 }
39
40 int BFS()
41 {
42 memset(level,-1,sizeof(level));
43 qs=qe=0;
44 level[src]=0;
45 que[qe++]=src;
46 while(qs<qe)
47 {
48 int u=que[qs++];
49 for(int i=head[u];i!=-1;i=edges[i].next)
50 {
51 int v=edges[i].v;
52 if(level[v]<0&&edges[i].w>0)
53 {
54 level[v]=level[u]+1;
55 que[qe++]=v;
56 }
57 }
58 }
59 return level[des]>0;
60 }
61
62 int DFS(int u,int minv)
63 {
64 if(u==des)
65 return minv;
66 int t;
67 for(int i=head[u];i!=-1;i=edges[i].next)
68 {
69 int v=edges[i].v;
70 if(edges[i].w>0&&level[v]==level[u]+1&&(t=DFS(v,min(edges[i].w,minv))))
71 {
72 edges[i].w-=t;
73 edges[i^1].w+=t;
74 return t;
75 }
76 }
77 level[u]=-1; // 从u出发无法找到argument
78 return 0;
79 }
80
81
82 int main()
83 {
84 while(scanf("%d%d%d",&n,&f,&d)!=EOF)
85 {
86 memset(head,-1,sizeof(head));
87 int w;
88 char str[MS];
89 des=f+2*n+d+1;
90 src=cnt=0;
91 for(int i=1;i<=f;i++)
92 {
93 scanf("%d",&w);
94 add(src,i,w);
95 }
96 // 0 1--> f, f+1--->f+n, f+n+1 --> f+2*n f+2*n+1-->f+2*n+d f+2*n+d+1;
97 for(int i=1;i<=n;i++)
98 add(f+i,f+n+i,1);
99 for(int i=1;i<=d;i++)
100 {
101 scanf("%d",&w);
102 add(f+2*n+i,des,w);
103 }
104 for(int i=1;i<=n;i++)
105 {
106 scanf("%s",str);
107 for(int j=0;j<f;j++)
108 {
109 if(str[j]=='Y')
110 {
111 add(j+1,f+i,1);
112 }
113 }
114 }
115
116 for(int i=1;i<=n;i++)
117 {
118 scanf("%s",str);
119 for(int j=0;j<d;j++)
120 {
121 if(str[j]=='Y')
122 {
123 add(f+n+i,f+2*n+j+1,1);
124 }
125 }
126 }
127 int ans=0;
128 int t;
129 while(BFS())
130 {
131 while(t=DFS(src,INF))
132 {
133 ans+=t;
134 }
135 }
136 printf("%d\n",ans);
137 }
138 return 0;
139 }
这题和poj 3281基本上是一样的。链接:Dining
Dining是每种食物和饮料只能分配给一个人。所以可以把容量看成1. 可以看成是一样的题目。 DINIC() 0ms;
1 #include <iostream>
2 #include <cstdio>
3 #include <cstring>
4 #include <cmath>
5 #include <algorithm>
6 #include <string>
7 #include <vector>
8 #include <set>
9 #include <map>
10 #include <stack>
11 #include <queue>
12 #include <sstream>
13 #include <iomanip>
14 using namespace std;
15 typedef long long LL;
16 const int INF = 0x4fffffff;
17 const double EXP = 1e-5;
18 const int MS = 805;
19 const int SIZE = 200005;
20
21
22 struct edge
23 {
24 int v,w,next;
25 }edges[SIZE];
26
27 int head[MS];
28 int level[MS];
29 int que[MS];
30 int qs,qe,cnt;
31 int n,f,d;
32 int src,des;
33
34 void add(int u,int v,int w)
35 {
36 edges[cnt].v=v;edges[cnt].w=w;edges[cnt].next=head[u];head[u]=cnt++;
37 edges[cnt].v=u;edges[cnt].w=0;edges[cnt].next=head[v];head[v]=cnt++;
38 }
39
40 int BFS()
41 {
42 memset(level,-1,sizeof(level));
43 qs=qe=0;
44 level[src]=0;
45 que[qe++]=src;
46 while(qs<qe)
47 {
48 int u=que[qs++];
49 for(int i=head[u];i!=-1;i=edges[i].next)
50 {
51 int v=edges[i].v;
52 if(level[v]<0&&edges[i].w>0)
53 {
54 level[v]=level[u]+1;
55 que[qe++]=v;
56 }
57 }
58 }
59 return level[des]>0;
60 }
61
62 int DFS(int u,int minv)
63 {
64 if(u==des)
65 return minv;
66 int t;
67 for(int i=head[u];i!=-1;i=edges[i].next)
68 {
69 int v=edges[i].v;
70 if(edges[i].w>0&&level[v]==level[u]+1&&(t=DFS(v,min(edges[i].w,minv))))
71 {
72 edges[i].w-=t;
73 edges[i^1].w+=t;
74 return t;
75 }
76 }
77 level[u]=-1; // 从u出发无法找到argument
78 return 0;
79 }
80
81
82 int main()
83 {
84 while(scanf("%d%d%d",&n,&f,&d)!=EOF)
85 {
86 memset(head,-1,sizeof(head));
87 int w;
88 char str[MS];
89 des=f+2*n+d+1;
90 src=cnt=0;
91 for(int i=1;i<=f;i++)
92 add(src,i,1);
93 // 0 1--> f, f+1--->f+n, f+n+1 --> f+2*n f+2*n+1-->f+2*n+d f+2*n+d+1;
94 for(int i=1;i<=n;i++)
95 add(f+i,f+n+i,1);
96 for(int i=1;i<=d;i++)
97 add(f+2*n+i,des,1);
98 int fsum,dsum,t;
99 for(int i=1;i<=n;i++)
100 {
101 scanf("%d%d",&fsum,&dsum);
102 for(int j=1;j<=fsum;j++)
103 {
104 scanf("%d",&t);
105 add(t,f+i,1);
106 }
107 for(int j=1;j<=dsum;j++)
108 {
109 scanf("%d",&t);
110 add(f+n+i,f+2*n+t,1);
111 }
112 }
113 int ans=0;
114 while(BFS())
115 {
116 while(t=DFS(src,INF))
117 {
118 ans+=t;
119 }
120 }
121 printf("%d\n",ans);
122 }
123 return 0;
124 }
HDU 4292 Food 多源多汇入门题的更多相关文章
- HDU 1284 钱币兑换问题(全然背包:入门题)
HDU 1284 钱币兑换问题(全然背包:入门题) http://acm.hdu.edu.cn/showproblem.php?pid=1284 题意: 在一个国家仅有1分,2分.3分硬币,将钱N ( ...
- hdu 1166敌兵布阵(线段树入门题)
>>点击进入原题测试<< 思路:这两天在学线段树,这个题直接手敲一下线段树就行了,都没有用上懒人标记.入门题 cin,cout会超时,记得加std::ios::sync_wit ...
- hdu 2993 MAX Average Problem(斜率DP入门题)
题目链接:hdu 2993 MAX Average Problem 题意: 给一个长度为 n 的序列,找出长度 >= k 的平均值最大的连续子序列. 题解: 这题是论文的原题,请参照2004集训 ...
- HDU 2089 不要62【数位DP入门题】
不要62 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- HDU 1241 连通块问题(DFS入门题)
Input The input file contains one or more grids. Each grid begins with a line containing m and n, th ...
- HDU 1251 裸的字典树、入门题
裸的字典树还是挺简单的. 四个基本操作建立.查找.插入.删除 建立新结点我是用的c++中 new操作.当然也可以用malloc,都方便 不过指针阿.地址阿.这其中关系什么的我貌似还不是很清楚阿. 因为 ...
- hdu 3695:Computer Virus on Planet Pandora(AC自动机,入门题)
Computer Virus on Planet Pandora Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 256000/1280 ...
- poj1459 Power Network (多源多汇最大流)
Description A power network consists of nodes (power stations, consumers and dispatchers) connected ...
- hdu 1465:不容易系列之一(递推入门题)
不容易系列之一 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Sub ...
随机推荐
- 理解RESTful架构——Restful API设计指南
理解RESTful架构 Restful API设计指南 理解RESTful架构 越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软件"采用客户端/服务器模式 ...
- python基础之python牛逼的设计模式
七大设计原则: 1.单一职责原则[SINGLE RESPONSIBILITY PRINCIPLE]:一个类负责一项职责. 2.里氏替换原则[LISKOV SUBSTITUTION PRINCIPLE] ...
- fdisk 磁盘分区命令
fdisk fdisk磁盘分区命令 -v 打印 fdisk 的版本信息并退出.-l 列出指定设备的分区表信息并退出. 如果没有给出设备,那么使用那些在 /proc/partitions ( ...
- 技术干货 | 如何在 Library 中使用/依赖 mPaaS?
使用场景 在使用 mPaaS 框架过程中,有时需要复用模块.复用时需要按照使用 Module 依赖的方式添加模块.本文以将复用 mPaaS 扫码组件的 Module 为例进行说明. 前提条件 已按照原 ...
- SpringBoot + WebSocket 实现答题对战匹配机制
概要设计 类似竞技问答游戏:用户随机匹配一名对手,双方同时开始答题,直到双方都完成答题,对局结束.基本的逻辑就是这样,如果有其他需求,可以在其基础上进行扩展 明确了这一点,下面介绍开发思路.为每个用户 ...
- unity inputfield 过滤emoji输入
unity版本:unity2017.1.5f1 复现步骤:InputField在安卓手机InputField连续输入两个emoji会报错 报错内容: 2020-01-08 19:56:38.366 2 ...
- 排查利器:Tcpdump抓包 & Wireshark解析
在工作这一块,免不了和其他开发人员打交道.比如,和其他部门 or 公司联调,甚至是和自己部门的人联调的时候.这时候,对接问题就很容易暴露出来,特别是Tcp/Udp会话的时候,很容易就会呈现出公说公有理 ...
- JVM-垃圾收集算法基础
目录 目录 前言 手动释放内存导致的问题 垃圾判定方法 哪些对象是垃圾? 引用计数算法 可达性分析法 垃圾收集算法 标记-清除 优点 缺点 优化 标记-复制 优点 缺点 优化 标记-整理 优点 缺点 ...
- redis中AOF和RDB的关闭方法
redis中AOF和RDB的关闭方法 问题:当往redis中导入数据时,有时会出现redis server went away的情况: 原因: 导入的数据量太大,而内存不够(即内存1G,但数据有2 ...
- Python+Selenium自动化-定位一组元素,单选框、复选框的选中方法
Python+Selenium自动化-定位一组元素,单选框.复选框的选中方法 之前学习了8种定位单个元素的方法,同时webdriver还提供了8种定位一组元素的方法.唯一区别就是在单词elemen ...