码迷,mamicode.com
首页 > 其他好文 > 详细

POJ1149 - PIGS - 网络流最大流 - 构图

时间:2021-05-24 03:46:14      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:需要   poj   序号   scan   names   false   while   网络   min   

AC代码

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<queue>
using namespace std;
#define inf 0x3f3f3f3f
const int N=1020;

int e[N][N],house[N],pre[N];
int m,n;
int s,t;
bool book[N];
int maxflow;

bool bfs()
{
    memset(book,false,sizeof(book));
    memset(pre,0,sizeof(pre));
    queue<int>Q;
    Q.push(s);
    book[s]=true;
    while(!Q.empty())
    {

        int p=Q.front();
        Q.pop();
        if(p==t)
            return true;
        for(int i=1; i<=t; i++)
        {
            if(book[i]==false)
            {
                if(e[p][i]>0)
                {
                    book[i]=true;
                    pre[i]=p;
                    Q.push(i);
                }
            }
        }
    }
    return false;
}

int solve()
{
    maxflow=0;
    while(1)
    {
        if(bfs()==false)
            return maxflow;
        int minn=inf;
        for(int i=t; i!=s; i=pre[i])
            minn=min(minn,e[pre[i]][i]);
        for(int i=t; i!=s; i=pre[i])
        {
            e[pre[i]][i]-=minn;
            e[i][pre[i]]+=minn;
        }
        maxflow+=minn;
    }
}

int main()
{
    int key,num;
    while(~scanf("%d %d",&m,&n))
    {
        memset(pre,0,sizeof(pre));
        memset(e,0,sizeof(e));
        s=0,t=n+1;
        for(int i=1; i<=m; i++)
            scanf("%d",&house[i]);
        for(int i=1; i<=n; i++) //构造网络流
        {
            scanf("%d",&key);//读入钥匙总数
            for(int j=1; j<=key; j++)
            {
                scanf("%d",&num);//读入每个钥匙能够打开的猪圈序号
                if(pre[num]==0)//第i个顾客是第num个猪圈的第一个顾客
                    e[s][i]+=house[num];//即该猪圈之前没有人要过这里面的猪
                else
                    e[pre[num]][i]=inf;
                pre[num]=i;
            }
            scanf("%d",&e[i][t]);//每个顾客需要买多少只猪
        }
        printf("%d\n",solve());
    }
    return 0;
}

POJ1149 - PIGS - 网络流最大流 - 构图

标签:需要   poj   序号   scan   names   false   while   网络   min   

原文地址:https://www.cnblogs.com/OFSHK/p/14749103.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!