H - Food - hdu 4292(简单最大流)
输入描述:

分析:以前是做过类似的题目的,不过输入的信息量比较大,还是使用邻接表的好些,邻接矩阵有可能会TLE,建图如下图流程

#include<stdio.h>
#include<algorithm>
#include<queue>
#include<string.h>
using namespace std; const int MAXN = ;
const int oo = 1e9+; struct Edge{int v, flow, next;}edge[MAXN*MAXN];
int Head[MAXN], cnt;
int layer[MAXN];///分层 void InIt()
{
cnt = ;
memset(Head, -, sizeof(Head));
}
void AddEdge(int u, int v, int flow)
{
edge[cnt].v = v;
edge[cnt].flow = flow;
edge[cnt].next = Head[u];
Head[u] = cnt++;
}
bool bfs(int start, int End)
{
queue<int> Q;Q.push(start);
memset(layer, , sizeof(layer));
layer[start] = ; while(Q.size())
{
int u = Q.front();Q.pop(); if(u == End)return true; for(int j=Head[u]; j!=-; j=edge[j].next)
{
int v = edge[j].v; if(layer[v] == false && edge[j].flow)
{
layer[v] = layer[u] + ;
Q.push(v);
}
}
} return false;
}
int dfs(int u, int MaxFlow, int End)
{
if(u == End)return MaxFlow; int uflow = ; for(int j=Head[u]; j!=-; j=edge[j].next)
{
int v = edge[j].v; if(layer[v]==layer[u]+ && edge[j].flow)
{
int flow = min(MaxFlow-uflow, edge[j].flow);
flow = dfs(v, flow, End); edge[j].flow -= flow;
edge[j^].flow += flow;
uflow += flow; if(uflow == MaxFlow)break;
}
} if(uflow == )
layer[u] = ;
return uflow;
}
int dinic(int start, int End)
{
int MaxFlow = ; while(bfs(start, End) == true)
MaxFlow += dfs(start, oo, End); return MaxFlow;
} int main()
{
int N, F, D; while(scanf("%d%d%d", &N, &F, &D) != EOF)
{///把人拆成两个中间流量是1
int Fi=N*, Di=Fi+F, start=Di+D+, End=start+;
int i, j, x; char s[MAXN]={}; InIt(); for(i=; i<=F; i++)
{///食物与源点相连
scanf("%d", &x);
AddEdge(start, Fi+i, x);
AddEdge(Fi+i, start, );
} for(i=; i<=D; i++)
{///饮料与汇点相连
scanf("%d", &x);
AddEdge(Di+i, End, x);
AddEdge(End, Di+i, );
} for(i=; i<=N; i++)
{///每个人对每种食物的喜欢或者不喜欢
scanf("%s", s+);
for(j=; s[j]; j++)
{
if(s[j] == 'Y')
{///建立食物和人的关系
AddEdge(Fi+j, i, );
AddEdge(i, Fi+j, );
}
} ///人拆成两个点
AddEdge(i, N+i, );
AddEdge(N+i, i, );
}
for(i=; i<=N; i++)
{///个人对饮料的喜爱
scanf("%s", s+);
for(j=; s[j]; j++)
{///建立饮料和人(拆点)的关系
if(s[j] == 'Y')
{
AddEdge(N+i, Di+j, );
AddEdge(Di+j, N+i, );
}
}
} printf("%d\n", dinic(start, End));
} return ;
}
H - Food - hdu 4292(简单最大流)的更多相关文章
- HDU 4292 Food 最大流
Food Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- H - Food HDU - 4292 网络流
题目 You, a part-time dining service worker in your college’s dining hall, are now confused with a n ...
- HDU 4292 Food (网络流,最大流)
HDU 4292 Food (网络流,最大流) Description You, a part-time dining service worker in your college's dining ...
- FFmpeg的H.264解码器源代码简单分析:环路滤波(Loop Filter)部分
===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...
- FFmpeg的H.264解码器源代码简单分析:宏块解码(Decode)部分-帧间宏块(Inter)
===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...
- FFmpeg的H.264解码器源代码简单分析:熵解码(Entropy Decoding)部分
===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...
- FFmpeg的H.264解码器源代码简单分析:解码器主干部分
===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...
- FFmpeg的H.264解码器源代码简单分析:解析器(Parser)部分
===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...
- FFmpeg的H.264解码器源代码简单分析:概述
===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...
随机推荐
- HDU 4607 Park Visit(树的直径)
题目大意:给定一棵树,让求出依次访问k个点的最小花费,每条边的权值都为1. 思路:如果能一直往下走不回来,那么这个路径肯定是最小的,这就取决于给定的k,但是怎么确定这个能一直走的长度呢,其实这个就是树 ...
- Python进阶:函数式编程实例(附代码)
Python进阶:函数式编程实例(附代码) 上篇文章"几个小例子告诉你, 一行Python代码能干哪些事 -- 知乎专栏"中用到了一些列表解析.生成器.map.filter.lam ...
- Asp.net Core 部署到Azure.cn的一个小问题
前一段尝试在azure.cn上部署Aps.net Core未成功,报503错误!在网上查到是Azure.cn的问题,未能完美支持Asp.net Core! Asp.net Core发表正式版了,又尝试 ...
- angular细节整理
记录angularjs中比较容易忽视的问题 1.关于动态生成ui-sref的问题 ui-route中ui-sref中的路径无法动态生成的,如果要实现动态生成ui-sref路径,可以使用$state.g ...
- ASP.NET C#使用JavaScriptSerializer实现序列化与反序列化得到JSON
在JavaScriptSerializer中,我们可以看到下面可以使用的方法或者构造函数,它们都是实例方法: Member Description JavaScriptSerializer() 构造函 ...
- (转)PHP ob_start() 函数介绍
php ob_start 与 ob_end_flush() 是 php 的缓冲输出函数. ob_start([string output_callback])- 打开输出缓冲区,所有的输出信息不在直接 ...
- sqlcode、sqlerrm
Oracle里 非常有用的 两个变量,很少有人用. 标记一下
- 使用mailto在网页中链接Email地址
<a>标签还有一个作用是可以链接Email地址,使用mailto能让访问者便捷向网站管理者发送电子邮件.我们还可以利用mailto做许多其它事情.下面一一进行讲解,请看详细图示: 注意:如 ...
- JavaScript--数组--关联(hash)数组
关联(hash)数组的原理: hash算法: 接收一个字符串,计算出一个尽量不重复的序号 不同的字符串,计算出的序号尽量不同 相同的字符串,计算出的序号一定是相同 存入数据时: 将自定义下标名称交给h ...
- C文件函数总结
1.fopen(打开文件) 表头文件 #include<stdio.h> 定义函数 FILE *fopen(const char * path,const char * mode); pa ...