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 ...
随机推荐
- QTableWidget简单操作
使用Qt设计师工具,在窗体上添加Table Widget控件,这样就可以使用ui全局变量来调用该控件了. Table Widget控件的应用 (1)设置列数和行数 //设¦¨¨置?列¢D数ºy和¨ª行 ...
- 转载:s:if的用法
转载网址:http://blog.csdn.net/menhuanxiyou/article/details/5709550 1:直接写表达式 <s:set name="china&q ...
- [TYVJ] P1025 单数?双数?
单数?双数? 背景 Background USACO OCT09 1ST 描述 Description Bessie那惨无人道的二年级老师搞了一个有 N (1 <= N <= 100) ...
- LeetCode_Distinct Subsequences
Given a string S and a string T, count the number of distinct subsequences of T in S. A subsequence ...
- python中的继承原则
继承是面向对象的重要特征之一,继承是两个类或者多个类之间的父子关系,子进程继承了父进程的所有公有实例变量和方法.继承实现了代码的重用.重用已经存在的数据和行为,减少代码的重新编写,python在类名 ...
- mysql Event、存储过程、表命令
Mysql事件调度器(Event Scheduler)类似于定时器,可以在某一个时间点执行一个SQL语句或一个语句块(BEGIN ... END):或者每隔固定间隔重复执行.类似于Linux下的cro ...
- java设计模式--行为型模式--模板方法
什么是模板方法,这个有待考虑,看下面: 模板方法 概述 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中. TemplateMethod使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步 ...
- 去掉java反编译(JD-GUI)生成的源文件中注释
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.Fi ...
- RFC3261--sip
本文转载自 http://www.ietf.org/rfc/rfc3261.txt 中文翻译可参考 http://wenku.baidu.com/view/3e59517b1711cc7931b716 ...
- Reverse Linked List II 解答
Question Reverse a linked list from position m to n. Do it in-place and in one-pass. For example:Giv ...