poj3436 ACM Computer Factory

原创 2018年04月16日 23:40:48

题意:一家公司有n台机器用来生产电脑,一个电脑有p个部分,要p个部分同时存在才算生产完成。对于一个机器,有三组数据描述。数据一:一个整数Q,用来表示机器一个小时能够加工多少电脑,数据二:(输入)p个整数,整数取值为0,1,2,用以表示电脑需满足这一组条件才能被这台机器加工。0表示这个部分不能有,1表示这个部分必须有,2表示这个部分可有可无。数据三:(输出)p个整数,整数取值为0,1。用以表示输出的电脑的状态,0表示这部分没有,1表示这部分有。可能数据二,三说得不是很清楚,举个例子:一台电脑由3个部分组成,某一台机器的数据二为(0,0,0),数据三为(1,0,1)。则表示这台机器只能加工第一部分,第二部分,第三部分均不存在的电脑,加工后这电脑有了第一部分,第三部分,缺失第二部分。然后题目要求将机器练成生产线,使得效率最大。输出还是很好理解的吧。


思路:这里我们需要建图,然后用最大流。我们将n台机器拆成2*n个点,如机器i拆成点i,和点i+n,点i表示输入,点i+n表示输出,然后我们多加两个点,源点s,汇点e。若机器i的输入全为0,则将点i与源点s相连,权值为MaxInt。若机器i的输出全为1,则将点i+n与汇点e相连,权值为MaxInt。之后再将点i与点i+n相连,权值为机器一小时加工电脑的数目Q。最后若机器i的输出与机器j的输入相等的话,则将点i+n与点j相连。建完图后,套个模板就可以了。

AC代码:

#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
#define inf 9999999
struct data
{
    int x,y,value;
}ans[505];
int p,k;
int map[205][205];
int cnt,ca[55];
int path[505];
bool findMaxflow()
{
    bool visited[505]={0};
    memset(path,0,sizeof(path));
    queue<int> qu;
    qu.push(0); visited[0]=1;
    while(!qu.empty())
    {
        int pos = qu.front();
        qu.pop();
        if(pos==2*k+1) return 1;
        for(int i=0;i<=2*k+1;i++)
        {
            if(!visited[i]&&map[pos][i]>0)
            {
                qu.push(i);
                visited[i]=1;
                path[i]=pos;
            }
        }
    }
    return 0;
}
void modifyMap(int &add)
{
    int pos = 2*k+1;
    add = inf;
    while(pos)
    {
        if(add>map[path[pos]][pos])
        add=map[path[pos]][pos];
        pos = path[pos];
    }
    pos = 2*k+1;
    while(pos)
    {
        map[path[pos]][pos]-=add;
        map[pos][path[pos]]+=add;
        pos = path[pos];
    }
}

int main()
{

    while(scanf("%d%d",&p,&k)!=EOF)
    {
        memset(map,0,sizeof(map));
        int input[55][15],output[55][15];
        cnt=0;
        for(int i=1;i<=k;i++)
        {
            scanf("%d",&ca[i]);
            for(int j=0;j<p;j++)
            scanf("%d",&input[i][j]);
            for(int j=0;j<p;j++)
            scanf("%d",&output[i][j]);
        }

        for(int i=1;i<=k;i++)
        {
            int j;
            for(j=0;j<p;j++)
            if(output[i][j]==0) break;
            if(j>=p) map[i+k][2*k+1]=inf;

            for(j=0;j<p;j++)
            if(input[i][j]==1) break;
            if(j>=p) map[0][i]=inf;

            map[i][i+k]=ca[i];
        }

        for(int i=1;i<=k;i++)
        {
            for(int j=1;j<=k;j++)
            {
                if(i==j) continue;
                int l;
                for(l=0;l<p;l++)
                {
                    if(input[j][l]==2) continue;
                    if(output[i][l]!=input[j][l]) break;
                }
                if(l>=p) map[i+k][j]=inf;
            }
        }
        int sum=0; int add;
        while(findMaxflow())
        {
            modifyMap(add);
            sum+=add;
        }
        printf("%d ",sum);
        for(int i=1;i<=k;i++)
        {
            for(int j=1;j<=k;j++)
            {
                if(i==j) continue;
                if(map[j][i+k]>0)
                {
                    ans[cnt].x=i;
                    ans[cnt].y=j;
                    ans[cnt++].value=map[j][i+k];
                }
            }
        }
        printf("%d\n",cnt);
        for(int i=0;i<cnt;i++)
        printf("%d %d %d\n",ans[i].x,ans[i].y,ans[i].value);

    }
    return 0;
}

POJ3436-ACM Computer Factory

转载请注明出处:優YoU  http://user.qzone.qq.com/289065406/blog/1299340266 提示:最大流问题      折磨了我3天的题。。。网上的前辈都...
  • lyy289065406
  • lyy289065406
  • 2011-07-30 18:25:29
  • 4718

poj3436 ACM Computer Factory

链接:http://poj.org/problem?id=3436 题意:有
  • u012914220
  • u012914220
  • 2014-04-24 19:21:30
  • 397

POJ3436 ACM Computer Factory

题意:有p个部件,n个厂,
  • eeeaaaaa
  • eeeaaaaa
  • 2014-11-01 10:07:43
  • 211

poj3436——ACM Computer Factory

题目大意: 输入: 输出: 分析: 代码:转载自
  • tzyshiwolaogongya
  • tzyshiwolaogongya
  • 2018-01-30 11:53:39
  • 17

POJ 3436 ACM Computer Factory(网络最大流)

http://poj.org/problem?id=3436 ACM Computer Factory Time Limit: 1000MS   Mem...
  • u012965890
  • u012965890
  • 2014-08-02 20:59:38
  • 1119

POJ_3436_ACM_ComputerFactory

ACM Computer Factory Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 64...
  • baidu_29410909
  • baidu_29410909
  • 2016-02-15 17:47:37
  • 317

kuangbin求带飞网络流 ACM Computer Factory(最大流节点型)

A - ACM Computer Factory Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu...
  • u013555159
  • u013555159
  • 2016-08-26 23:29:01
  • 537

POJ3436 ACM Computer Factory 【最大流】

ACM Computer Factory Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5412   Accep...
  • u012846486
  • u012846486
  • 2014-09-28 15:06:23
  • 844

POJ3436 ACM Computer Factory【网络流】

题意:有n台机器组装有p个零件的电脑,每台机器的输入参数为0、1、2,分别代表某个零件无、有、可有可无。输出参数为0、1,代表某个零件无、有。每台机器有加工上限,问最多能组装多少电脑 思路:最大流...
  • wjw1340
  • wjw1340
  • 2017-09-15 18:31:11
  • 54

(最大流) poj3436 ACM Computer Factory

ACM Computer Factory Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 51...
  • LycenYao
  • LycenYao
  • 2014-07-17 20:08:16
  • 255
收藏助手
不良信息举报
您举报文章:poj3436 ACM Computer Factory
举报原因:
原因补充:

(最多只允许输入30个字)