题意:

第一行输入m和n,m是猪圈的数量,n是顾客的数量,下面n行 第 i+1行表示第i个顾客 , 输入第一个数字表示有几把猪圈的钥匙,后面输入对应的猪圈,最后一个数字输入顾客想买几头猪.

建图:

设一个源点 s 和一个汇点 t,s 连接猪圈被第一个打开的顾客,权值为猪圈的猪数量,t 与顾客相连,权值为顾客想要的猪的数量,因为题上说迈克会根据下一个顾客的需求来将猪转移到合适的猪圈,所以顾客与同一猪圈排队的后面紧邻的顾客相连,权值为正无穷。

想一下感觉挺对的,s点有无数头猪,但是边的权值为猪圈的数量,说明顾客只能拿这么多,后面紧邻的顾客最然边权是无穷大,但被前面的顾客限制着,虽然顾客可以拿到猪圈里的猪,但是能带到 t 汇点的最多是自己想要的数量,所以求s到t的最大流。

注意:

书上的代码还要开一个数组记录残留网络什么的,我觉得太繁琐,直接在一个 e [ ] [ ]数组里面操作就好。注释的代码是自己建图错误了

关于网络流数组操作

为什么要正向边减去 流,反向边加上 流?

我觉得就像水流一样,从 s 流到 t 后,再沿着原路返回(进行加减操作),如果这个残余网络还有路径可以流,就根据这个残余网络找s到t的路径。

#include<stdio.h>
#include<vector>
#include<string.h>
#include<queue>
using namespace std;
int s,t,n,m,pig[1010],p[120],a[1010],v[1010][120],e[120][120],inf=0x3f3f3f3f;
int bfs()//广搜去找增广路,记录路径
{
int book[110];
for(int i=0; i<=t; i++)
book[i]=0,a[i]=-1;
queue<int>q;
q.push(s);
book[s]=1;
while(!q.empty())
{
int k=q.front();
q.pop();
if(k==t)
return 1;
for(int i=1; i<=t; i++)
{
if(e[k][i]&&!book[i])
{
a[i]=k;
book[i]=1;
q.push(i);
}
}
}
return 0;
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
memset(v,0,sizeof(v));
memset(e,0,sizeof(e));
s=m+1,t=m+2;
int t1,t2;
for(int i=1; i<=n; i++)
scanf("%d",&pig[i]);//几号猪舍有几头猪
int last[1120],num,k;
memset(last,0,sizeof(last));//记录几号猪舍前面一个顾客是谁
for(int i=1;i<=m;i++)//开始建图
{
scanf("%d",&num);
for(int j=0;j<num;j++)
{
scanf("%d",&k);
if(last[k]==0)
e[s][i]+=pig[k];
else
e[last[k]][i]=inf;
last[k]=i;
}
scanf("%d",&e[i][t]);
}//建图完成
// for(int i=1;i<=t;i++)
// {
// for(int j=1;j<=t;j++)
// printf("%d ",e[i][j]);
// printf("\n");
// }
// for(int i=1; i<=m; i++)
// {
// scanf("%d",&t1);
// int k;
// for(k=1; k<=m; k++)
// if(v[i][k]==0)
// break;
// for(int j=1; j<=t1; j++)
// {
// scanf("%d",&t2);
// v[i][k++]=t2;
// }
// scanf("%d",&p[i]);//几号顾客买几只猪
// }
// // for(int i=1; i<=n; i++) //几号猪舍
// {
// for(int j=1; j<=m&&v[i][j]; j++) //第几位顾客
// {
// if(j==1)
// e[s][v[i][j]]+=pig[i];
// else
// e[v[i][j-1]][v[i][j]]=inf;
// }
// }
// for(int i=1; i<=m; i++)
// e[i][t]=p[i];//建图完成 int sum=0;
while(1)
{
int h=t,minn=inf;
if(!bfs())//直到找不到增广路为止
break;
while(a[h]!=-1)//找到所走路径上最短的边
{
if(e[a[h]][h]<minn)
minn=e[a[h]][h];
h=a[h];
}
sum+=minn;
h=t;
while(a[h]!=-1)//减去那个最短的边,再反向加上
{
e[a[h]][h]-=minn;
e[h][a[h]]+=minn;
h=a[h];
}
}
printf("%d\n",sum);
}
return 0;
}

PIGS POJ - 1149网络流(最短增广路---广搜) + 建图的更多相关文章

  1. 网络流 A - PIGS POJ - 1149 最大流

    A - PIGS POJ - 1149 这个题目我开始感觉很难,然后去看了一份题解,写的很好 https://wenku.baidu.com/view/0ad00abec77da26925c5b01c ...

  2. AC日记——pigs poj 1149

    POJ - 1149 思路: 最大流: 代码: #include <cstdio> #include <cstring> #include <iostream> # ...

  3. POJ 1149 网络流 合并建图

    这个题目我敲了一个简单的EK,这不是难点 难点在于建图,按题目的要求 每个猪圈和顾客都建点的话,那也太多了...我看了Edelweiss里面的缩点方法才建好的图,哎,惭愧啊 实际那些猪圈根本不需要单独 ...

  4. POJ 1161 Walls【floyd 以面为点建图】

    题目链接:http://poj.org/problem?id=1161 题目大意: 1.给出m个区域,n个俱乐部点.接下来是n个俱乐部点以及各个区域由什么点围成.求一个区域到各个俱乐部点的距离之和最小 ...

  5. PIGS POJ - 1149(水最大流)

    题意: 有M个猪圈,每个猪圈里初始时有若干头猪.一开始所有猪圈都是关闭的.依次来了N个顾客,每个顾客分别会打开指定的几个猪圈,从中买若干头猪.每个顾客分别都有他能够买的数量的上限.每个顾客走后,他打开 ...

  6. POJ 2226 Muddy Fields(二分匹配 巧妙的建图)

    Description Rain has pummeled the cows' field, a rectangular grid of R rows and C columns (1 <= R ...

  7. poj 1087 A Plug for UNIX(字符串编号建图)

    A Plug for UNIX Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 14862   Accepted: 5026 ...

  8. poj 1149 Pigs 网络流-最大流 建图的题目(明天更新)-已更新

    题目大意:是有M个猪圈,N个顾客,顾客要买猪,神奇的是顾客有一些猪圈的钥匙而主人MIRKO却没有钥匙,多么神奇?顾客可以在打开的猪圈购买任意数量的猪,只要猪圈里有足够数量的猪.而且当顾客打开猪圈后mi ...

  9. HDU3549 Flow Problem(网络流增广路算法)

    题目链接. 分析: 网络流增广路算法模板题.http://www.cnblogs.com/tanhehe/p/3234248.html AC代码: #include <iostream> ...

随机推荐

  1. 关于vue+element-ui项目的分页,返回默认显示第一页的问题解决

    关于vue+element-ui项目的分页,返回默认显示第一页的问题解决     问题描述 当前页面如下: 然后点击页码跳到第3页,然后在第三页点击页面链接跳转到新的页面 然后在新页面点击返回按钮,返 ...

  2. win10 64位 安装JDK1.8

    win10 64位 jdk1.8 配置Java环境,是否安装JRE. 一.安装得有JRE JDK和JRE分别安装再不同的文件夹下 新建:JAVA_HOME 值:JDK的安装路径 新建:CLASSPAT ...

  3. linux lsof常用方法

    lsof简介 lsof(list open files)是一个列出当前系统打开文件的工具,在linux环境下,任何事物都是以文件形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件.系统 ...

  4. [工具] Docker安装及portainer GUI

    一.Docker Engine安装 1.安装流程 1)移除旧版本(如果有旧版本) yum remove docker \ docker-client \ docker-client-latest \ ...

  5. 三年前端,面试思考(头条蚂蚁美团offer)

    小鱼儿本人985本科,软件工程专业,前端.工作三年半,第一家创业公司,半年.第二家前端技术不错的公司,两年半.第三家,个人创业半年.可以看出,我是个很喜欢折腾的人,大学期间也做过很多项目,非常愿意参与 ...

  6. 如何理解js中的this和实际应用中需要避开哪些坑

    this是什么 this就是函数内部的关键字 看下面例子理解js中的this // 例子1 function fnOne () { console.log(this) } 'use strict' f ...

  7. Tomcat 之startup.bat启动失败案例

    今天我在部署一个Tomcat环境时,各种变量都配置完了,最后启动Tomcat时,Tomcat一闪而过,当时我的内心是崩溃的~~ 然后我就开始百度.定位问题.进入cmd命令行窗口,cd进入到Tomcat ...

  8. 【猫狗数据集】pytorch训练猫狗数据集之创建数据集

    猫狗数据集的分为训练集25000张,在训练集中猫和狗的图像是混在一起的,pytorch读取数据集有两种方式,第一种方式是将不同类别的图片放于其对应的类文件夹中,另一种是实现读取数据集类,该类继承tor ...

  9. 多道技术 进程 线程 协程 GIL锁 同步异步 高并发的解决方案 生产者消费者模型

    本文基本内容 多道技术 进程 线程 协程 并发 多线程 多进程 线程池 进程池 GIL锁 互斥锁 网络IO 同步 异步等 实现高并发的几种方式 协程:单线程实现并发 一 多道技术 产生背景 所有程序串 ...

  10. javascript的“好莱坞原则”

    好莱坞原则——不要给我们打电话,我们会给你打电话(don‘t call us, we‘ll call you).在Javascript中就是:别调用我们,我们会调用你. “好莱坞原则”强调的是高层对低 ...