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 ...
随机推荐
- python类传参示例
1 class f(): 2 3 def __init__(self, *args, **kwargs): 4 print('args Is', args) # args Is ('5', 'fff' ...
- 联想 lenove 3750 M4服务器更改启动项和管理口IP
联想 lenove 3750 M4服务器更改启动项和管理口IP 注: 因为在机房拍照的原因,再加上工作比较忙:整理成文档的时候有的过程已经忘记了,所以有的步骤可能会缺失,里面的选项都已经用中文方式表达 ...
- 013.Ansible Playbook include
一 include 当项目越大,tasks越多的时候.如果将多有的task写入一个playbook中,可读性很差,就需要重新组织playbook 可以把一个playbook分成若干份晓得palyboo ...
- 030. Python装饰器
一 装饰器 1.1 装饰器介绍 扩展函数新功能的@定义:替换旧函数,返回新函数,在不改变原有代码的前提下,为该函数扩展新功能;语法:@ (语法糖) 1.2 装饰器的原型 def show(func) ...
- STM32电路设计注意
以后画STM32的电路板 VDDA一定要接 张JF说 VDDA是给内部的时钟电路供电的 还有一定要留 串口或者 下载调试口(串口) 或者显示器接口 输入输出设备最好都留着 这样才能方便调试
- docker 部署应用
Docker 部署应用 所需环境 Linux系统:centos7 (推荐7.4) Docker环境:V1.13.1 镜像:应用镜像包 docker部署和基本命令: 1. docker环境搭建 a) ...
- RAM与FLASH
以前一直使用STM32但是对 变量 或 函数 的存储域没做任何了解:只知道你需要存储的东西就放在Flash的后面几页就好了:这次接触到STM8发现编译器里面有特别的存储查看器就打算看看到底是怎么存储的 ...
- MindSpore激活函数总结与测试
技术背景 激活函数在机器学习的前向网络中担任着非常重要的角色,我们可以认为它是一个决策函数.举个例子说,我们要判断一个输出的数据是猫还是狗,我们所得到的数据是0.01,而我们预设的数据中0代表猫1代表 ...
- 离散傅里叶变换的衍生,负频率、fftshift、实信号、共轭对称
封面是福州的福道,从高处往下看福道上的人在转圈圈.从傅里叶变换后的频域角度来看,我们的生活也是一直在转圈圈,转圈圈也是好事,说明生活有规律,而我们应该思考的是,如何更有效率地转圈圈--哦别误会,我真不 ...
- 查看mysql的数据库物理存放位置
1.查看mysql的数据库物理存放位置: show global variables like "%datadir%";