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 ...
随机推荐
- xsos:一个在Linux上阅读SOSReport的工具
xsos:一个在Linux上阅读SOSReport的工具 时间 2019-05-23 14:36:29 51CTO 原文 http://os.51cto.com/art/201905/596889 ...
- Linux性能分析利器——火焰图的安装使用
火焰图(flame graph)是性能分析的利器,通过它可以快速定位性能瓶颈点. perf 命令(performance 的缩写)是 Linux 系统原生提供的性能分析工具,会返回 CPU 正在执行的 ...
- 回归(regression)与分类(classification)的区别
术语监督学习,意指给出一个算法,需要部分数据集已经有正确的答案. " 分类和回归的区别在于输出变量的类型. 定量输出称为回归,或者说是连续变量预测:定性输出称为分类,或者说是离散变量预测. ...
- 5.1-5 uname、hostname、dmesg、stat、du
5.1 uname:显示系统信息 uname命令用于显示系统相关信息,比如内核版本号.硬件架构等. -a 显示系统所有相关信息 -v 显示内核版本 -m 显示计算机硬件架构 ...
- 关于步进电机驱动板,tb6560
参考的,淘宝上买来的步进电机S曲线驱动方法,发现 他程序输出的PWM波形全是方波, 占空比为50% 而且他 修改这两个数来输出波形,所以 我打算参考这个来写一个驱动 TIMX_CNT中放置的是当前计 ...
- linux命令--使用fsck修复文件系统
使用fsck修复文件系统错误 1.问题描述 服务器maint_samba 由于服务器maint_samba (debian操作系统)没有正常关机,在重新启动过程中/dev/sdb1出现文件系统错误,需 ...
- EdgeX Foundry试运行
EdgeX Foundry试运行 简介 EdgeX Foundry是一个由Linux基金会发起的,且厂商中立的开源IoT边缘计算项目.它可以采集来自多个源的数据,并将这些数据转发到一个中央系统.Edg ...
- AI算子列表
AI算子列表 概述 目前只有部分算子可在一个库中同时运行在MLU220和MLU270平台.也就是用户使用 ./build_cnplugin.sh --mlu270 命令编译生成的 libcnplugi ...
- AIFramework基本概念整理
AIFramework基本概念整理 本文介绍: 对天元 MegEngine 框架中的 Tensor, Operator, GradManager 等基本概念有一定的了解: 对深度学习中的前向传播.反向 ...
- MindInsight张量可视设计介绍
MindInsight张量可视设计介绍 特性背景 张量可视,能够帮助用户直观查看训练过程中的Tensor值,既支持以直方图的形式呈现Tensor的变化趋势,也支持查看某次step的具体Tensor值. ...