POJ

来源:互联网 发布:javascript 价格表 编辑:程序博客网 时间:2024/06/07 06:03

POJ - 3281 

题意: 很多只牛,每只牛都有很多喜欢的食物和饮料,但是每次只能选一个食物和一个饮料,问最终能使多少牛满意

思路: : ) 我能说我是当二分图写的吗,但是后来发现,如果直接连饮料和食物,那么会出现,一只牛喜欢的,可能会有超过一个牛的匹配出现,所以不能这样,其实这里的牛和饮料,牛和食物,分别是一个二分图,他们的限制就是牛只能选一个食物,一个饮料,那么就需要把牛拆点,这样牛就只能选一个饮料和一份食物啦。

flow - > 限制条件

#include <cstdio>#include <iostream>#include <cstring>#include <algorithm>using namespace std;const int maxn = 500,maxe = maxn*maxn,inf = 0x3f3f3f3f;int n,m,k;struct node{    int to,next,cap,rev;    node(){}    node(int a,int b,int c,int d){to = a; next = b; cap = c; rev = d;}}edge[maxe << 3];int edgenum,s,t;int h[maxn],vis[maxn];void init(){    for(int i = 0; i < maxn; i++)        h[i] = -1;    edgenum = 0;}void add(int f,int t){    edge[edgenum] = node(t,h[f],1,edgenum+1); h[f] = edgenum++;    edge[edgenum] = node(f,h[t],0,edgenum-1); h[t] = edgenum++;}int dfs(int u,int f){    if(u == t) return f;    vis[u] = 1;    for(int i = h[u] ; ~i; i = edge[i].next)    {        int v = edge[i].to,cap = edge[i].cap,rev = edge[i].rev;        if(vis[v] || cap == 0) continue;        int d = dfs(v,min(f,cap));        if(d == 0) continue;        else        {            edge[i].cap -= d;            edge[rev].cap += d;            return d;        }    }    return 0;}void solve(){    int flow = 0;    for(;;)    {        memset(vis,0,sizeof(vis));        int f = dfs(0,inf);        if(f == 0) break;        flow += f;    }    printf("%d\n",flow);}int main(){    while(~scanf("%d%d%d",&n,&m,&k))    {        init();        int a,b,c;        s = 0, t = 2*n+m+k+1;        for(int i = 1; i <= n; i++) add(i,i+n);        for(int i = 2*n+1; i <= 2*n+m; i++) add(s,i);        for(int i = 2*n+m+1; i <= 2*n+m+k; i++) add(i,t);        for(int i = 0; i < n ; i ++)        {            scanf("%d%d",&a,&b);            for(int j = 0; j < a; j++)            {                scanf("%d",&c);                add(c+2*n,i+1);            }            for(int j = 0; j < b; j++)            {                scanf("%d",&c);                add(i+n+1,c+2*n+m);            }        }        solve();    }    return 0;}