poj1149最大流

 #include <cstdio>
#include <cstring>
#include <algorithm>
#include <climits>
#include <string>
#include <iostream>
#include <map>
#include <cstdlib>
#include <list>
#include <set>
#include <queue>
#include <stack>
using namespace std;
const int INF=0xfffffff;
int n,m;
const int maxn=1111;
int level[maxn];
int Map[maxn][maxn];
int last[maxn];
int s,e;
int pig[maxn];
bool bfs()
{
    memset(level,0,sizeof(level));
    queue<int> q;
    q.push(s);level[s]=1;
    while(!q.empty()){
        int cur=q.front();q.pop();
        for(int i=0;i<=n+1;i++){
            if(!level[i]&&Map[cur][i]){
                level[i]=level[cur]+1;
                q.push(i);
            }
        }
    }
    return level[e];
}
int Min(int a,int b)
{
    return a>b?b:a;
}
int dfs(int x,int val)
{
    int tem=val;
    if(x==e) return val;
    for(int i=0;i<=n+1;i++){
        if(level[i]==level[x]+1&&Map[x][i]&&tem){
            int t=dfs(i,Min(val,Map[x][i]));
            Map[x][i]-=t;Map[i][x]+=t;
           // cout<<tem<<endl;system("pause");
        //   if(t==0) return 0;
           tem-=t;
        }
    }
    return val-tem;
}
int solve()
{
    int ans=0;int t;
    while(bfs()){
        while(t=dfs(s,INF)) ans+=t;
    }
    return ans;
}
int main()
{
    while(scanf("%d%d",&m,&n)!=EOF){
    s=0;e=n+1;
    int t;int k;
    memset(last,0,sizeof(last));
    memset(Map,0,sizeof(Map));
    for(int i=1;i<=m;i++)
        scanf("%d",&pig[i]);
    for(int i=1;i<=n;i++){
        scanf("%d",&t);
        for(int j=0;j<t;j++){
            scanf("%d",&k);
            if(last[k]==0){
                Map[s][i]+=pig[k];
            }
            else Map[last[k]][i]=INF;
            last[k]=i;
        }
        scanf("%d",&Map[i][e]);
    }
    printf("%d\n",solve());
    }
    return 0;
}

poj1149最大流

时间: 2024-10-08 22:34:08

poj1149最大流的相关文章

poj1149 最大流好题 难在建图 好题

这个题的意思是有M个猪圈, N个人, 每个人按次序可以访问一些猪圈并可以买走一定数量的猪, 并且一个人用自己所拥有的猪圈钥匙打开猪圈后这些猪可以重新分配到已经打开的猪圈中, 问你可以买的最多的猪是多少个?强烈推荐看这个博文, 非常感谢博主 http://ycool.com/post/zhhrrm6 代码如下:

poj 1273.PIG 解题报告

网络流 关键是建图,思路在代码里 /* 最大流SAP 邻接表 思路:基本源于FF方法,给每个顶点设定层次标号,和允许弧. 优化: 1.当前弧优化(重要). 1.每找到以条增广路回退到断点(常数优化). 2.层次出现断层,无法得到新流(重要). 时间复杂度(m*n^2) */ #include <iostream> #include <cstdio> #include <cstring> #define ms(a,b) memset(a,b,sizeof a) using

POJ1149 PIGS【特殊建图,最大流】

看题解做的,看懂了怎么建图后,套上挑战icpc的最大流模版,就A了,上题解 题意:M个猪圈,N个顾客,每个顾客有一些的猪圈的钥匙,只能购买这些有钥匙的猪圈里的猪,而且要买一定数量的猪,每个猪圈有已知数量的猪,但是猪圈可以重新打开,将猪的个数,重新分配,以达到卖出的猪的数量最多. 思路:刚学网络流,表示很菜很菜很菜~~①构造网络,将顾客看成源点和汇点以外的结点,并设另外两个节点:源点和汇点.②源点和每个猪圈的第一个顾客连边,边的权是开始时候猪圈中猪的数量.③ 若源点和某个节点之间有重边,则将权合并

poj1149 PIGS --- 最大流EK

有m个猪圈,给出初始时每个猪圈里有几头猪,有n个顾客,每个顾客可能在某k个猪圈里买猪,总共要买a头. 顾客依次买猪,每次买完后,猪圈主人可以把猪圈里的猪转移到别的猪圈.每个猪圈的容量是无限大的. 问一天最多能卖多少猪. 整体读下来可以知道,要卖更多的猪,就要在每个顾客买之前,把尽量多的猪转移到下一个顾客要可以买的k个猪圈里. 也就是一个最大流问题. 把相邻两个顾客所选的猪圈之间建边,容量是inf. 添加一个源点与第一个顾客建边,权值为每个猪圈里猪的头数,第一次的容量是受猪圈里猪的数量限制的而不是

POJ1149 PIGS 最大流-建模

题目链接: POJ1149 题意: 麦克是农场主有N个猪圈,每个猪圈都有一把锁但麦克没有钥匙.要买猪的顾客一个接一个来到养猪场,每个顾客有一些猪圈的钥匙,而且他们要买一定数量的猪.当每个顾客到来时,他将那些他拥有钥匙的猪圈全部打开:迈克从这些猪圈中挑出一些猪卖给他们:如果迈克愿意,迈克可以重新分配这些被打开的猪圈中的猪:当顾客离开时,猪圈再次被锁上.给出每个猪圈的初始的猪的数量,求麦克能卖出猪的最大数量 思路: 注意顾客是一个接一个有顺序来的 网络流以顾客为节点建模 1) 将顾客看作除源点和汇点

【Poj1149】Pigs(最大流)

Description 一个工人在养猪场卖猪,现在有m个猪圈和n个顾客,每个猪圈的容量没有限制,每个顾客来之后会打开指定的猪圈,然后买猪,然后关闭所有他打开的猪圈,顾客总是一个接一个的来,当猪圈打开的时候,工人可以随意挪动打开的猪圈中的猪(只能在打开的猪圈中相互移动)问工人一天最多卖出去多少猪 Solution 建一下图跑一下最大流就行,怎么建图以后再说 Code #include <cstdio> #include <algorithm> #define N 110 #defin

POJ1149 PIGS [最大流 建图]

PIGS Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 20662   Accepted: 9435 Description Mirko works on a pig farm that consists of M locked pig-houses and Mirko can't unlock any pighouse because he doesn't have the keys. Customers come t

POJ1149.PIGS(迈克卖猪问题)——最大流

http://poj.org/problem?id=1149 题目描述: 迈克在一个养猪场工作,养猪场里有M 个猪圈,每个猪圈都上了锁.由于迈克没有钥匙,所以他不能打开任何一个猪圈.要买猪的顾客一个接一个来到养猪场,每个顾客有一些猪圈的钥匙,而且他们要买一定数量的猪.某一天,所有要到养猪场买猪的顾客,他们的信息是要提前让迈克知道的.这些信息包括:顾客所拥有的钥匙(详细到有几个猪圈的钥匙.有哪几个猪圈的钥匙).要购买的数量.这样对迈克很有好处,他可以安排销售计划以便卖出的猪的数目最大.更详细的销售

poj1149 PIGS 最大流(神奇的建图)

一开始不看题解,建图出错了.后来发现是题目理解错了.  if Mirko wants, he can redistribute the remaining pigs across the unlocked pig-houses. 题目中的这句话非常关键,没理解就错掉了.有很多人写的题解只告诉我们怎么做,却没告诉我们为什么要那样做. 这句话是的意思是可以重组打开过的猪圈.也就是当客人打开猪圈(他能打开的都打开了)以后,他选择了需要买的猪以后,Mirko可以随意把剩下的猪分配到打开的猪圈中.当然,我