关闭

POJ 3281 Dining

标签: POJACM网络流最大流
335人阅读 评论(2) 收藏 举报
分类:

这里写图片描述

题的地址:http://poj.org/problem?id=3281

题目大意:有f种食物,d种饮料,n头奶牛,只能吃某种食物和饮料(而且只能吃特定的一份),一种食物被一头,牛吃了之后,其余牛就不能吃了,第一行有n,f,d三个整数,接着每一行代表第几头牛,前面两个整数是fi与di(食物与饮料的种类数量),接着是食物的种类与饮料的种类,要求输出最多分配能够满足的牛的数量

解题思路:很明显 此题可以用到网络流中的求最大流的知识。只是想想该怎么建图,建图是关键,建完图直接套网络流求最大流的模板即可AC

图大致是这样的,0表示源点,2*n+f+d+1表示汇点

由源点指向食物,再由食物指向牛,牛再指向对应的饮料,饮料再指向汇点 中间牛与牛再相连

//Memory: 304K  
//Time: 0MS 
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <map>
#include <cmath>
#include <queue>
#include <string>
#include <vector>
#include <set>

using namespace std;

#define ll long long
#define sc(x) scanf("%d",&x)
#define dsc(x,y) scanf("%d%d",&x,&y)
#define sssc(x)   scanf("%s",s)
#define sdsc(x,y) scanf("%s %s",x,y)
#define ssc(x,y,z) scanf("%d%d%d",&x,&y,&z)
#define pr(x) printf("%d\n",x)
#define FOR(i,n,o) for(int i=o;i<=n;i++)
#define lcr(a,b)  memset(a,b,sizeof(a))
#define Inf 1<<29


const int maxn=101;
const int maxm=maxn*maxn;
int n,f,s,t,d,m,e,head[maxn*maxn],vis[maxn*maxn];
queue <int> p;
struct node
{
    int v;
    int c;
    int next;
}q[maxn*maxn];
void add(int u,int v,int c)
{
      q[e].v=v;q[e].c=c;q[e].next=head[u];head[u]=e++;
      q[e].v=u;q[e].c=0;q[e].next=head[v];head[v]=e++;
}
int bfs(int s,int t)
{
            lcr(vis,0);
            while(!p.empty())
                p.pop();
            vis[s]=1;
            p.push(s);
            while(!p.empty())
            {
                int u=p.front();
                p.pop();
                for(int i=head[u];~i;i=q[i].next)
                {
                     int v=q[i].v;
                     if(!vis[v]&&q[i].c)
                     {
                         vis[v]=vis[u]+1;
                         p.push(v);
                         if(v==t)
                            return vis[t];
                     }
                }
            }
            return vis[t];
}
int dfs(int u,int maxf)
{
             int flow=0;
        if(u==t||maxf==0)
        {
            return maxf;
        }
        for(int i=head[u],f;~i;i=q[i].next)
        {
            int v=q[i].v;
            if(vis[v]==vis[u]+1&&q[i].c&&(f=dfs(v,min(q[i].c,maxf))))
            {
                  q[i].c-=f;
                  q[i^1].c+=f;
                  maxf-=f;
                  flow+=f;
                  if(!maxf)
                    break;
            }
        }
        if(!flow)
            vis[u]=0;
        return flow;
}
int maxif(int s,int t)
{
      int maxid=0;
      while(bfs(s,t))
      {
          while(1)
          {
            int f=dfs(s,Inf);
            if(f==0)
              break;
            maxid+=f;
          }
      }
      return maxid;
}
int main()
{
    while(~ssc(n,f,d))
    {
         e=0;
        lcr(head,-1);
        s=0;//源点
        t=1+n*2+f+d;//汇点
        FOR(i,f,1)
        add(s,i,1);//连接汇点与食物
        FOR(i,d,1)
        add(f+2*n+i,t,1);//连接饮料与汇点
        FOR(i,n,1)
        add(f+i,f+n+i,1);//连接中间的牛与牛
        FOR(i,n,1)
        {
             int a,b;
             dsc(a,b);
             FOR(j,a,1)
             {
                   int tt;
                   sc(tt);
                   add(tt,i+f,1);//连接食物和牛
             }
             FOR(j,b,1)
             {
                 int tt;
                 sc(tt);
                 add(f+n+i,f+2*n+tt,1);//连接牛和饮料
             }
         }
        pr(maxif(s,t));
    }
    return 0;
}

END!!!!!!!!!!!!!!!!!!!!!!

2
0
查看评论

poj3281 - Dining

想看更多的解题报告:http://blog.csdn.net/wangjian8006/article/details/7870410              ...
  • wangjian8006
  • wangjian8006
  • 2012-09-01 20:35
  • 3401

POJ 3281 Dining(最大流dinic&&SAP)

Description Cows are such finicky eaters. Each cow has a preference for certain foods and drinks, and she will consume no others. Farmer John has co...
  • u013582254
  • u013582254
  • 2015-02-09 23:32
  • 916

Dining POJ - 3281 Dining 拆点+最大流

传送门:POJ3281 题意:有N头牛,F种食物和D种饮料,每头牛都有各自喜欢的食物和饮料,每种饮料或食物只能分配给一头牛,问最多有多少头牛能同时得到自己喜欢的食物和饮料。 思路:一开始把饮料和食物放在一起建图, 想了很久也没想出个所以然来。 正解:将饮料和食物分别放在两边,中间用牛隔开,并且...
  • lxy767087094
  • lxy767087094
  • 2017-06-16 00:05
  • 143

POJ 3281 Dining 网络流

题意: 给出N,F,D。表示N头牛,F种食物,D种饮料。 接下来2-N+1行,输入n,m代表第i头牛喜欢的食物种类为n,饮料种类为m。接下来输入n个数,代表食物的编号,输入m个数,代表饮料的编号。 输出最多能满足多少头牛吃上喜欢的食物和饮料。 思路: 将牛拆成2个点,左边为食物,右边为饮料。 s--...
  • kdqzzxxcc
  • kdqzzxxcc
  • 2012-09-17 21:29
  • 500

(拆点+最大流)POJ3281 Dining

题目大意是N头牛,准备了F种食物,D种饮料,每一头牛会喜欢若干种食物和饮料,但它只能选择一种食物和一种饮料,且每种食物和饮料都只够一头牛选择,问怎样分配能使得食物和饮料都能得到的牛的数量最多,求这个数。 明显的一道最大流的题目,难点只在怎么建模。建模的方法如下: 1.建立一个超级源,跟每种食物之...
  • LycenYao
  • LycenYao
  • 2015-07-16 19:58
  • 781

poj 3281 Dining (最大流)

题目;http://poj.org/problem?id=3281 思路:将牛拆开,分别一一对应,然后构建有向图: S(源点)    食物(1-F) 牛(1——N) 牛(1-N) 饮料(1-D) 汇点T 单向边,每条边容量为1 ,转换为最大流问题: 至于为什么要把对应的牛...
  • xiaozhuaixifu
  • xiaozhuaixifu
  • 2013-09-07 11:37
  • 1371

poj 3281 Dining(网络流)

题意:有N只牛,F种食物和D种饮料,每只牛最多只能吃它们喜爱的一种食物和一种饮料,问最多能满足多少只牛,所以建图时,如果是源点(0)——食物——牛——饮料——汇点(t),权值全为1,这样会导致多条流从食物——牛——饮料,这样就不符合题意的每只牛最多只能吃它们喜爱的一种食物和一种饮料,所以当建图是源点...
  • Kirito_j
  • Kirito_j
  • 2016-08-13 11:08
  • 199

poj 3281 Dining

题目链接:poj 3281         给定n头牛,f种shiwu
  • u010535824
  • u010535824
  • 2014-08-02 09:58
  • 309

poj 3281 Dining (网络流)

DescriptionCows are such finicky eaters. Each cow has a preference for certain foods and drinks, and she will consume no others.Farmer John has cooked...
  • u010379542
  • u010379542
  • 2017-07-10 20:05
  • 128

poj(3281)Dining

难点在于建图; 要将牛拆分成 两个点,一个与drink相连,一个与food相连,这两个点也连,他们的权值为一。。 #include"stdio.h" #include"string.h" #include"queue" #defi...
  • u011519618
  • u011519618
  • 2013-08-07 13:19
  • 398
    个人资料
    • 访问:92147次
    • 积分:4328
    • 等级:
    • 排名:第8295名
    • 原创:232篇
    • 转载:13篇
    • 译文:0篇
    • 评论:49条
    My princess

    点图片联系我

    点击这里给我发消息

    点图片联系我

    变强变强变强!!!!!!!
    点击这里给我发消息
    最新评论
    4
    点击这里给我发消息