题目链接:

https://vjudge.net/problem/POJ-1149

题目大意:

M个猪圈,N个顾客,每个顾客有一些的猪圈的钥匙,只能购买这些有钥匙的猪圈里的猪,而且要买一定数量的猪,每个猪圈有已知数量的猪,
但是猪圈可以重新打开,将猪的个数,重新分配,以达到卖出的猪的数量最多。

思路:

难点在于如何构造容量网络

(1)将顾客看做出源点和汇点之外的结点,另外增加源点s和汇点t

(2)源点和每个猪圈的第一个用户连边,边权是猪圈中猪的数目

(3)若有重边,将权合并

(4)顾客j紧跟在顾客i之后打开某个猪圈,则边<i, j>是正无穷,因为如果顾客j紧跟在i之后,那么流到i的猪可以自由分配该j,所以设置为INF。

(5)每个顾客可汇点之间的连边,边权就是自己希望,买到的猪的数目

构建好容量网络之后,就用模板就OK啦

传送门:网络流学习

 #include<iostream>
#include<vector>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
const int INF = 0x3f3f3f3f;
const int maxn = + ;//顾客的数目
const int maxm = + ;//猪圈的数目 struct edge
{
int u, v, c, f;
edge(int u, int v, int c, int f):u(u), v(v), c(c), f(f){}
};
vector<edge>e;
vector<int>G[maxn];
int a[maxn], p[maxn];
int m;
void init(int n)
{
for(int i = ; i <= n; i++)
G[i].clear();
e.clear();
}
void addedge(int u, int v, int c)
{
e.push_back(edge(u, v, c, ));
e.push_back(edge(v, u, , ));//反向边
m = e.size();
G[u].push_back(m - );
G[v].push_back(m - );
}
int Maxflow(int s, int t)
{
int flow = ;
for(;;)
{
memset(a, , sizeof(a));//每次找增广路的每个点的流量
queue<int>q;
q.push(s);
a[s] = INF;
while(!q.empty())
{
int u = q.front();
q.pop();
for(int i = ; i < G[u].size(); i++)
{
edge& now = e[G[u][i]];
int v = now.v;
if(!a[v] && now.c > now.f)//v点还没有流到并且这条边还没满
{
p[v] = G[u][i];//反向记录边
a[v] = min(a[u], now.c - now.f);//到达v点的水量取决于边剩余的容量和u点的水量
q.push(v);
}
}
if(a[t])break;//已到达终点
}
if(!a[t])break;//已经找不到增广路
for(int u = t; u != s; u = e[p[u]].u)
{
e[p[u]].f += a[t];
e[p[u]^].f -= a[t];
}
flow += a[t];
}
return flow;
}
int pig[maxm];//每个猪圈猪的数目
int last[maxm];//每个猪圈的前一个顾客的序号
int Map[maxn][maxn];//顾客顾客之间的边,有重边,先用数组记录
int main()
{
int n, m;
cin >> m >> n;
for(int i = ; i <= m; i++)cin >> pig[i];
int s = , t = n + ;//设置源点和汇点
int d, x;
for(int i = ; i <= n; i++)//顾客编号
{
cin >> d;
for(int j = ; j < d; j++)
{
cin >> x;//猪圈编号
if(last[x] == )//猪圈的第一个顾客
addedge(s, i, pig[x]);
else addedge(last[x], i, INF);//顾客i紧接着顾客last[x]后面打开猪圈x
last[x] = i;
}
cin >> x;//到汇点的边的权值
addedge(i, t, x);
}
cout<<Maxflow(s, t)<<endl;
return ;
}

POJ-1149 PIGS---最大流+建图的更多相关文章

  1. POJ 1149 - PIGS - [最大流构图]

    Time Limit: 1000MS Memory Limit: 10000K Description Mirko works on a pig farm that consists of M loc ...

  2. poj 1149 pigs ---- 最大流

    题意以及分析:http://ycool.com/post/zhhrrm6#rule3 主要是建图,简化图,然后在套最大流的模板. #include <iostream> #include& ...

  3. POJ1149 PIGS [最大流 建图]

    PIGS Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 20662   Accepted: 9435 Description ...

  4. POJ 1149 猪圈买猪 建图太强大!! 没有透彻领悟 慢慢消化

    PIGS Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 19575   Accepted: 8948 Description ...

  5. poj 1149 pigs(最大流)

    题目大意:迈克在农场工作,农场有 m 个猪舍,每个猪舍有若干只猪,但是迈克不能打开任何一间猪舍.有 n 个顾客前来购买,每个顾客有最大的购买数量,每个顾客可以购买某些猪舍的猪,且顾客可以打开这些猪舍, ...

  6. POJ 3281 Dining ( 最大流 && 建图 )

    题意 : 有 N 头牛,John 可以制作 F 种食物和 D 种饮料, 然后接下来有 N 行,每行代表一头牛的喜好==>开头两个数 Fi 和 Di 表示这头牛喜欢 Fi 种食物, Di  种饮料 ...

  7. [poj] 1149 PIGS || 最大流经典题目

    原题 题目大意 给你m个猪圈以及每个猪圈里原来有多少头猪,先后给你n个人,每个人能打开一些猪圈并且他们最多想买Ki头猪,在每一个人买完后能将打开的猪圈中的猪顺意分配在这次打开猪圈里,在下一个人来之前 ...

  8. poj 3281 最大流+建图

    很巧妙的思想 转自:http://www.cnblogs.com/kuangbin/archive/2012/08/21/2649850.html 本题能够想到用最大流做,那真的是太绝了.建模的方法很 ...

  9. 图论--网络流--最大流--POJ 3281 Dining (超级源汇+限流建图+拆点建图)

    Description Cows are such finicky eaters. Each cow has a preference for certain foods and drinks, an ...

  10. poj3680 Intervals 区间k覆盖问题 最小费用最大流 建图巧妙

    /** 题目:poj3680 Intervals 区间k覆盖问题 最小费用最大流 建图巧妙 链接:http://poj.org/problem?id=3680 题意:给定n个区间,每个区间(ai,bi ...

随机推荐

  1. MySQL 杂项

    关于MySQL mysql连接时的--prompt 和 --delimiter 参数是用来设置什么的? 设置提示符和分隔符 mysql查看创建数据库时的字符集命令? SHOW CREATE DATAB ...

  2. Codeforces - 102222A - Maximum Element In A Stack - 模拟

    https://codeforc.es/gym/102222/problem/F 注意到其实用unsigned long long不会溢出. #include<bits/stdc++.h> ...

  3. Mysql:主从集群配置

    我这里是去网易蜂巢取得镜像:https://c.163yun.com/hub#/m/home/ 命令:docker pull hub.c.163.com/library/mysql:latest 拉取 ...

  4. tp5模型事件回调函数中不能使用$this

    tp5模型事件回调函数中不能使用$this,使用会报错,涉及到数据库操作使用Db类,不能使用$this->save()之类的方式 如果回调函数中需要使用类内函数,需要将函数定义为static,通 ...

  5. jmeter beanshell Typed variable declaration : Object constructor错误

    从数据库取值和响应值做比较,使用beanshell如下: import org.json.JSONArray; import org.json.JSONObject; res_str = prev.g ...

  6. vue中比较完美请求的栗子(使用 axios 访问 API)

    vue中比较完美请求的栗子(使用 axios 访问 API) 官网地址:https://vuejs.bootcss.com/v2/cookbook/using-axios-to-consume-api ...

  7. crawlspider的源码学习

    Spider基本上能做很多事情了,但是如果你想爬取全站的话,可能需要一个更强大的武器.CrawlSpider基于Spider,但是可以说是为全站爬取而生.CrawlSpiders是Spider的派生类 ...

  8. Java对日期Date类进行加减运算一二三

    转载大神 https://blog.csdn.net/hacker_lees/article/details/74351838

  9. 阿里巴巴Java开发手册_不建议在循环体中使用+进行字符串拼接

    18. [推荐]循环体内,字符串的连接方式,使用StringBuilder的append方法进行扩展. 说明:下例中,反编译出的字节码文件显示每次循环都会new出一个StringBuilder对象,然 ...

  10. 《zabbix监控的搭建》centos5.8 32

    系统环境centos5.8 32位操作系统   这里以zabbix-2.2.7为例: 下载官方的软件包: http://pan.baidu.com/s/1ntuTRYh 官方的参考文档: https: ...