poj 1149
#include <cstdio>
#include <cstring>
#include <queue>
#define _clr(x, y) memset(x, y, sizeof(x))
#define Min(x, y) (x < y ? x : y)
#define INF 0x3f3f3f3f
#define N 150
#define M 1005
using namespace std; int resi[N][N], h[N], ef[N];
int dist[N], pre[N];
int Maxf, S, T;
bool used[N];
queue<int> Q; // 一般预流推进算法 --47ms
void Push(int x)
{
for(int i=; i<=T; i++)
{
int tmp = Min(ef[x], resi[x][i]);
if(tmp> && (x==S || h[x]==h[i]+))
{
resi[x][i] -= tmp, resi[i][x] += tmp;
ef[x] -= tmp, ef[i] += tmp;
if(i==T) Maxf += tmp;
if(i!=S && i!=T) Q.push(i);
}
}
} void Push_Relabel(int n)
{
Maxf = ;
_clr(ef, );
_clr(h, );
h[S] = n, ef[S]=INF, ef[T]=-INF;
Q.push(S);
while(!Q.empty())
{
int x = Q.front();
Q.pop();
Push(x);
if(x!=S && x!=T && ef[x]>)
{
h[x]++;
Q.push(x);
}
}
printf("%d\n",Maxf);
} void Init(int m, int n)
{
int pig[M], last[M];
int num, k;
S=, T=n+;
_clr(last, );
_clr(resi, );
for(int i=; i<=m; i++)
scanf("%d", pig+i);
for(int i=; i<=n; i++)
{
scanf("%d", &num);
for(int j=; j<num; j++)
{
scanf("%d", &k);
if(last[k]==)
resi[S][i] += pig[k];
else
resi[last[k]][i] = INF;
last[k] = i;
}
scanf("%d", resi[i]+T);
}
} // 连续最短曾广路算法 --17ms
bool bfs_dinic()
{
_clr(dist, -);
dist[S] = ;
Q.push(S);
while(!Q.empty())
{
int u = Q.front();
Q.pop();
for(int i=; i<=T; i++)
{
if(dist[i]< && resi[u][i])
{
dist[i] = dist[u]+;
Q.push(i);
}
}
}
return dist[T]> ? : ;
} int dfs(int x, int f)
{
int a=;
if(x==T) return f;
for(int i=; i<=T; i++)
{
if(resi[x][i] && dist[i]==dist[x]+ && (a=dfs(i, Min(f, resi[x][i]))))
{
resi[x][i] -= a, resi[i][x] += a;
return a;
}
}
return ;
} void Dinic()
{
int ans=, a;
while(bfs_dinic())
while(a=dfs(, INF)) ans+= a;
printf("%d\n", ans);
} // EK算法 --0ms
bool bfs()
{
_clr(used, );
_clr(pre, -);
int Sta[N], top=;
used[S] = true;
Sta[top++] = S;
while(top)
{
int u = Sta[--top];
for(int i=; i<=T; i++)
{
if(resi[u][i] && !used[i])
{
used[i] = true;
pre[i] = u;
if(i==T) return true;
Sta[top++] = i;
}
}
}
return false;
}
void EK()
{
int maxf=, d;
while(bfs())
{
d = INF;
for(int i=T; i!=S; i=pre[i])
d = Min(d, resi[pre[i]][i]);
for(int i=T; i!=S; i=pre[i])
{
resi[pre[i]][i] -= d;
resi[i][pre[i]] += d;
}
maxf += d;
}
printf("%d\n", maxf);
}
int main()
{
int n, m;
while(~scanf("%d%d", &m, &n))
{
while(!Q.empty()) Q.pop();
Init(m, n);
EK();
//Push_Relabel(n);
//Dinic();
}
return ;
}
poj 1149的更多相关文章
- poj 1149 Pigs 网络流-最大流 建图的题目(明天更新)-已更新
题目大意:是有M个猪圈,N个顾客,顾客要买猪,神奇的是顾客有一些猪圈的钥匙而主人MIRKO却没有钥匙,多么神奇?顾客可以在打开的猪圈购买任意数量的猪,只要猪圈里有足够数量的猪.而且当顾客打开猪圈后mi ...
- AC日记——pigs poj 1149
POJ - 1149 思路: 最大流: 代码: #include <cstdio> #include <cstring> #include <iostream> # ...
- POJ 1149 PIGS(Dinic最大流)
PIGS Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 20738 Accepted: 9481 Description ...
- 网络流 A - PIGS POJ - 1149 最大流
A - PIGS POJ - 1149 这个题目我开始感觉很难,然后去看了一份题解,写的很好 https://wenku.baidu.com/view/0ad00abec77da26925c5b01c ...
- poj 1149 最大流
题目链接:http://poj.org/problem?id=1149 #include <cstdio> #include <cmath> #include <algo ...
- 网络流相关知识点以及题目//POJ1273 POJ 3436 POJ2112 POJ 1149
首先来认识一下网络流中最大流的问题 给定一个有向图G=(V,E),把图中的边看做成管道,边权看做成每根管道能通过的最大流量(容量),给定源点s和汇点t,在源点有一个水源,在汇点有一个蓄水池,问s-t的 ...
- POJ 1149 PIGS
PIGS Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 20579 Accepted: 9387 Description ...
- POJ 1149 PIGS 【网络流】
题意: m n //有m个猪圈,n个人卖猪. a1...am //编号为i的猪圈里有ai头猪. b1 c1...cb1 d1 //第i个人有bi把钥匙,分别是ci猪圈的,其它猪圈里的猪都 ...
- POJ 1149 PIGS ★(经典网络流构图)
[题意] 有M个猪圈,每个猪圈里初始时有若干头猪.一开始所有猪圈都是关闭的.依 次来了N个顾客,每个顾客分别会打开指定的几个猪圈,从中买若干头猪.每 个顾客分别都有他能够买的数量的上限.每个顾客走后, ...
- poj 1149 PIGS【最大流经典建图】
PIGS Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 18727 Accepted: 8508 Description ...
随机推荐
- 基于nginx的rtmp的服务器(nginx-rtmp-module)
一,首先下载安装nginx需要依赖的库文件: 1.1,选定源码目录 选定目录 /usr/local/RTMP cd /usr/local/RTMP 1.2,安装PCRE库 cd /usr/local/ ...
- 判别linux机器字节序为大端还是小端
代码如下: #include <iostream> #include <arpa/inet.h> #include <cstdio> using namespace ...
- 慕课linux学习笔记(五)常用命令(2)
链接命令 Ln [原文件] [目标文件] -s 表示创建软链接 硬链接特征: 拥有相同的i节点和存储block块,可以看做是同一个文件 通过i节点识别 不能跨分区 不能针对目录用 软链接特征: 不同的 ...
- JS判断访问设备、客户端操作系统类型
先给出一个实例:判断windows.linux.android 复制以下代码另存为html文件即可. <html> <head> <title>判断操作系统< ...
- Hdu1091
#include <stdio.h> int main() { int a,b; while(scanf("%d %d",&a,&b)){ && ...
- .NET抽象工厂模式微理解--教你在项目中实现抽象工厂
.NET抽象工厂模式微理解--教你在项目中实现抽象工厂 最近在学习MVC,对于MVC里面的一些项目上的东西都和抽象模式有关,今天就微说明一下个人对于抽象工厂模式的理解,以方便学习MVC及工厂模式相关的 ...
- oracle ed命令
今天在弄oracle sqlplus的时候需要写一个存储过程,用ed进入之后,退不出来了. 从网上找到下面的方法处理: 如何退出sqlplus ed操作 今天进入sqlplus ,执行完语句后 ...
- Oracle instr用法
1:实现indexOf功能,.从第1个字符开始,搜索第1次出现子串的位置 ,) as i from dual; select instr('oracle','or') as i from dual; ...
- Codeforces 245H Queries for Number of Palindromes
http://codeforces.com/contest/245/problem/H 题意:给定一个字符串,每次给个区间,求区间内有几个回文串(n<=5000) 思路:设定pd[i][j]代表 ...
- hex、bin、elf、axf文件区别
AXF和ELF axf文件是ARM的调试文件,除了包含bin的内容之外,还附加了其他的调试信息,这些调试信息加在可执行的二进制数据的前面.在调试的时候,这些调试信息是不必下到RAM中去的,真正下到RA ...