POJ-3281 Dining(最大流)

原创 2016年05月31日 16:59:48


设容量为1,流量为0的边为edge.
用0表示源点,从零到每个食物之间连上edge,在从食物到相应的牛上连上edge,再从第i个牛到第i个牛上连上edge,在从牛到饮料上连上edge,从饮料到汇点连上edge.
食物标记:1-f;
第一次n头牛f+1, f+n;
第二次n头牛f+n+1, f+2*n;
饮料:f+2*n+1, f+2*n+d;
汇点:f+2*n+d+1;

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <stack>
#include <queue> 
#define maxn 605 
#define INF 1e9
typedef long long ll;

using namespace std;
struct Edge{
    Edge(){
    }
    Edge(int a, int b, int c, int d){
        from = a;
        to = b;
        cap = c;
        flow = d;
    }
    int from, to, cap, flow;
};
vector<Edge> edge;
vector<int> v[maxn];
int p[maxn], a[maxn], n, f, d;
void Addedge(int from, int to){

    edge.push_back(Edge(from, to, 1, 0));
    edge.push_back(Edge(to, from, 0, 0));
    int dd = edge.size();
    v[from].push_back(dd-2);
    v[to].push_back(dd-1);
}
void Init(){

    edge.clear();
    for(int i = 0; i < maxn; i++)
     v[i].clear(); 
    for(int i = 1; i <= n; i++){
        int k1, k2, a;
        scanf("%d%d", &k1, &k2);
        for(int j = 1; j <= k1; j++){
            scanf("%d", &a);
            Addedge(a, i+f);
        }
        for(int j = 1; j <= k2; j++){
            scanf("%d", &a);
            Addedge(f+n+i, f+2*n+a);
        }
    }
    for(int i = 1; i <= f; i++){
        Addedge(0, i);
    }
    for(int i = 1; i <= d; i++){
        Addedge(f+2*n+i, f+2*n+d+1);
    }
    for(int i = 1; i <= n; i++){
        Addedge(i+f, i+f+n);
    }
}
int MaxFlow(){

    int e = f + 2 * n + d + 1;
    int ans = 0;
    while(1){

        memset(a, 0, sizeof(a));
        a[0] = INF;
        queue<int> q;
        q.push(0);
        while(!q.empty()){

            int k = q.front();
            q.pop();
            for(int i = 0; i < v[k].size(); i++){
                Edge &e = edge[v[k][i]];
                if(a[e.to] == 0 && e.cap > e.flow){
                    a[e.to] = min(a[k], e.cap - e.flow);
                    q.push(e.to);
                    p[e.to] = v[k][i];
                }
            }
        }
        if(a[e] == 0)
          break;
        ans += a[e];
        for(int i = e; i != 0; i = edge[p[i]].from){
            edge[p[i]].flow += 1;
            edge[p[i]^1].flow -= 1;
        }
    }
    return ans;
}
int main(){

//  freopen("in.txt", "r", stdin);
    while(scanf("%d%d%d",&n, &f, &d) == 3){
        Init();
        cout << MaxFlow() << endl;
    }
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

POJ-3281 Dining Dinic最大流

MMPDining Time Limit: 2000MS Memory Limit: 65536K DescriptionCows are such finicky eaters. Ea...
  • simpsonk
  • simpsonk
  • 2017年07月10日 17:52
  • 186

POJ-3281 Dining(最大流)

 B - Dining Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu Su...
  • haut_ykc
  • haut_ykc
  • 2016年08月05日 16:10
  • 140

POJ-3281 Dining(最大流)

Dining Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 15653   Accept...
  • qq_31759205
  • qq_31759205
  • 2016年11月02日 00:28
  • 87

POJ-3281 Dining(最大流)

题目:POJ-3281 Dining   题目大意:一个农场场主,为他的n头牛做了f种食物和d种饮料,每头牛都有他喜欢的食物和饮料,而且,每个食物或饮料都只能给一头牛食用,问最多能同时满足多少头牛的...
  • m0_37772713
  • m0_37772713
  • 2017年12月07日 22:46
  • 20

POJ-3281 Dining (最大流[Ford-Fulkerson])

首先,一头牛必须吃到一种食物,喝到一种饮料才算数,所以食物和饮料同时连到一头牛身上是不可以的(可以看做并联吧),然后就想到拆点,但是拆点后怎么连都还是是并联,完全没想到换一下顺序...最终还是看了一下...
  • idealism_xxm
  • idealism_xxm
  • 2016年05月14日 00:05
  • 203

poj3281 Dining-网络流最大流-多对一的匹配

poj3281 Dining Cows are such finicky eaters. Each cow has a preference for certain foods and drinks,...
  • ly59782
  • ly59782
  • 2016年10月18日 14:24
  • 227

POJ 3281-Dining(最大流入门,建图详细解析)

ACM-ICPC 最大流入门题 建图详细解析
  • u010595112
  • u010595112
  • 2014年03月10日 15:10
  • 1065

POJ-3281 Dining

题目链接:Dining 题目大意:N头牛,F个食物,D瓶饮料,每头牛有各自的喜好,问最多使多少头牛既吃到自己喜欢的食物又喝到自己喜欢的饮料。 解题思路:一开始想到的是二分最大匹配,但发现无法在匹配...
  • Minakami_Yuki
  • Minakami_Yuki
  • 2015年09月05日 15:41
  • 197

poj Dining 3281 (最大流问题&&机智建图) 好题

Dining Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 11833   Accepted: 5441 ...
  • yanghui07216
  • yanghui07216
  • 2015年11月03日 18:24
  • 493

poj-3281【最大流】

转换成最大流求解,刚开始看最大流,留着当模板 #include #include #include #include #include #include #include #inclu...
  • zq17865815296
  • zq17865815296
  • 2016年11月12日 10:52
  • 124
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ-3281 Dining(最大流)
举报原因:
原因补充:

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