poj 1149 pigs 增广路 ford

题目关键是建模,之后就是简单地增广路。

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
const int N=1024;
const int inf=1<<24;
struct
{
    int c,f;
}g[1024][1024];

int n,m,s,t;
queue<int>q;

void ford()
{
    int a[N],vis[N],p[N],maxflow=0;
    while(1)
    {
        memset(a,0,sizeof(a));
        memset(p,0,sizeof(p));
        memset(vis,0,sizeof(vis));
        while(!q.empty()) q.pop();
        q.push(0);
        a[0]=inf;
        vis[0]=1;
        p[0]=0;
        while(!q.empty()&&vis[t]==0)
        {
            int x=q.front();
            //printf("%d\n",x);
            q.pop();
            for(int i=0;i<=t;i++)
            {
                if(vis[i]!=0) continue;
                //printf("%d %d\n",i,g[x][i]);
                if(g[x][i].c<inf&&g[x][i].c>g[x][i].f)
                {
                    p[i]=x;
                    a[i]=min(a[x],g[x][i].c-g[x][i].f);
                    vis[i]=1;
                    q.push(i);
                }
                else if(g[i][x].c<inf&&g[i][x].f>0)
                {
                    p[i]=x;
                    a[i]=min(a[x],g[i][x].f);
                    vis[i]=1;
                    q.push(i);
                }
            }
        }
        if(vis[t]==0||a[t]==0) break;
        int k1=t,k2=p[k1];
        int add=a[t];
        while(1)
        {
            if(g[k2][k1].f<inf)
                g[k2][k1].f+=add;
            else
                g[k1][k2].f-=add;
            if(k2==0) break;
            k1=k2;
            k2=p[k1];
        }

    }

    for(int i=0;i<t;i++)
        if(g[i][t].f<inf)
            maxflow+=g[i][t].f;

    printf("%d\n",maxflow);
}

int main()
{
    int i,j,num,k,a[1024],last[1024];
    while(~scanf("%d%d",&m,&n))
    {
        for(i=1;i<=m;i++)
            scanf("%d",&a[i]);

        for(i=0;i<1024;i++)
            for(j=0;j<1024;j++)
                g[i][j].c=g[i][j].f=inf;

        memset(last,0,sizeof(last));
        s=0;
        t=n+1;
        for(i=1;i<=n;i++)
        {
            scanf("%d",&num);
            for(j=0;j<num;j++)
            {
                scanf("%d",&k);
                if(last[k]==0)
                    {
                        if(g[0][i].c==inf)
                            g[0][i].c=a[k];
                        else
                            g[0][i].c+=a[k];
                        g[0][i].f=0;
                    }
                else
                    g[last[k]][i].c=inf/2,g[last[k]][i].f=0;
                last[k]=i;
            }
            scanf("%d",&g[i][t].c);
            g[i][t].f=0;
        }
        ford();
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-30 23:56:21

poj 1149 pigs 增广路 ford的相关文章

hdu 1532 Drainage Ditches 增广路 ford

#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <stack> #include <set> #include <map> #include <string> #include <ma

POJ 1149 PIGS 最大流

第一次做网络流,看着教材里面的题解做的= = 用的是Ford,应该是最好理解的把,就是不断的找有没有从源点到汇点的增广路然后更新. 建图真是难啊,而且感觉细节要注意的地方比较多,一开始没有考虑反向弧,WA了两发,sad... #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <climits> #include <strin

POJ 1149 PIGS 迈克卖猪问题 网络流构图+三种AC方法

题目链接:POJ 1149 PIGS PIGS Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 16533   Accepted: 7403 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 key

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

Time Limit: 1000MS Memory Limit: 10000K 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 to the farm one after another. Each of them has ke

POJ 1149 PIGS(最大流)

POJ 1149 PIGS 题目链接 题意:有n个猪圈,m个顾客,猪圈中一开始有一些猪,顾客轮流来(注意是有先后顺序的),然后每个顾客会开启一些猪圈,在开启的猪圈中最多买b只猪,之后可以任意把剩下的猪分配到开着的猪圈中,问最多能卖出几只猪 思路:这题的关键在于建模,由于顾客有先后顺序,假如后来的顾客会开启x门,前面一个顾客也会开启x门,那么前面顾客相当与可以分配给后面顾客, 所以建模的方式为,源点和每个猪圈连,容量为猪圈猪数,每个猪圈和第一个开的顾客连,如果后面有顾客会开这个猪圈,则和之前的顾客

最大流——增广路算法

关于网络流的增广路算法,网上有很多详细介绍,这里是摘录的模板.详细请见:http://www.cnblogs.com/kuangbin/archive/2011/07/26/2117636.html 1 #include<iostream> 2 #include<iomanip> 3 #include<ctime> 4 #include<climits> 5 #include<algorithm> 6 #include<queue>

POJ 1149 PIGS(最大流+建图)

题目链接:http://poj.org/problem?id=1149 题意:M个猪圈,N个顾客,每个顾客有一些的猪圈的钥匙,只能购买能打开的猪圈里的猪,而且要买一定数量的猪,每个猪圈有已知数量的猪, 但是猪圈可以重新打开,将猪的个数,重新分配,但是只能将猪往当前打开状态的猪圈里赶,以达到卖出的猪的数量最多. 思路:还是4部分,源点->猪圈->猪圈->汇点 Accepted 976K 63MS C++ 能用EK水的,当然用EK水 #include <iostream> #in

关于最短增广路算法和连续最短增广路算法的操作步骤

最短增广路算法(SAP): 1.初始化容量网络和网络流: 2.构造残留网络和层次网络,如果汇点不在层次网络中,则算法结束: 3.在层次网络中不断用BFS增广,直到层次网络中没有增广路为止:每次增广完毕,在层次网络中要去掉因改进流量而导致饱和的弧: 4.转到步骤(2). 连续最短增广路算法(Dinic): 1.初始化容量网络和网络流: 2.构造残留网络和层次网络,如果汇点不在层次网络中,则算法结束: 3.在层次网络中用一次DFS过程进行增广,DFS执行完毕,该阶段的增广也执行完毕: 4.转到步骤(

Power Network(最大流基础_增广路算法:多源多汇,自建总源点和总汇点)

 Power NetworkCrawling in process... Crawling failed Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Description A power network consists of nodes (power stations, consumers and dispatchers) connected by p