poj3189 Steady Cow Assignment --- 多重匹配,二分图匹配解法

有n头牛,m个牛棚,每头牛对牛棚的满意程度有一个排序,每个牛棚有牛数限制。

问如何分配各个牛,使得所有牛的满意程度的差值最小。

这题首先可以想到二分答案,对于每一种差值来求是否可行。

不想再搞网络流,学习了下二分图匈牙利解法。。

匹配时,对于每一种选择(牛棚),若满足范围,且有多余的容量,则匹配;

否则,对于该牛棚已经匹配过的牛进行增广。

#include <iostream>
#include <cstdlib>
#include <cstring>
#include <string>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
#define inf 0x3f3f3f3f
#pragma comment(linker, "/STACK:16777216")
#define eps 1e-6
#define ll __int64
const int maxn=1005;
using namespace std;
int link[25][maxn],rk[maxn][25],cap[maxn],num[maxn];
bool vis[maxn];
int n,m,r,l;

int path(int u)
{
    int v;
    for(v=0;v<m;v++)
    {
        if(rk[u][v]>=r&&rk[u][v]<=l&&!vis[v])
        {
            vis[v]=1;
            if(num[v]<cap[v])
            {
                link[v][++num[v]]=u;// v牛棚的第num[v]头牛
                return 1;
            }
            for(int i=1;i<=cap[v];i++)
            {
                if(path(link[v][i]))
                {
                    link[v][i]=u;
                    return 1;
                }
            }
        }
    }
    return 0;
}

int hungry()
{
    memset(num,0,sizeof num);
    memset(link,-1,sizeof link);
    for(int i=0;i<n;i++)
    {
        memset(vis,0,sizeof vis);
        if(!path(i)) return 0;
    }
    return 1;
}

int main()
{
    int mid,ans,i,j;
    while(~scanf("%d%d",&n,&m))
    {
        for(i=0;i<n;i++)
            for(j=0;j<m;j++)
            {
                scanf("%d",&ans);
                rk[i][--ans]=j;//存ans这个牛棚对于i这头牛的排序是多少
            }
        for(i=0;i<m;i++)
            scanf("%d",&cap[i]);
        r=l=0;
        ans=inf;
        while(r<=l&&l<m)
        {
            mid=l-r+1;
            if(hungry())
            {
                r++;
                if(mid<ans)
                    ans=mid;
            }
            else l++;
        }
        printf("%d\n",ans);
    }
    return 0;
}
时间: 2024-10-07 05:27:09

poj3189 Steady Cow Assignment --- 多重匹配,二分图匹配解法的相关文章

POJ3189 Steady Cow Assignment —— 二分图多重匹配/最大流 + 二分

题目链接:https://vjudge.net/problem/POJ-3189 Steady Cow Assignment Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6979   Accepted: 2418 Description Farmer John's N (1 <= N <= 1000) cows each reside in one of B (1 <= B <= 20) barns wh

Poj 3189 Steady Cow Assignment (多重匹配)

题目链接: Poj 3189 Steady Cow Assignment 题目描述: 有n头奶牛,m个棚,每个奶牛对每个棚都有一个喜爱程度.当然啦,棚子也是有脾气的,并不是奶牛想住进来就住进来,超出棚子的最大容量了,棚子是拒绝的.现在要给每个奶牛安家,本宝宝是一个公正无私的人类,所以要找一个奶牛喜爱程度差值最小的方案(虽然这样大家的喜爱程度可能普遍偏低,因为绝对公平并不代表合理啊),问喜爱程度的区间最小为多大? 解题思路: 每个棚子并不是住一个奶牛,所以是多重匹配咯.匹配的时候二分枚举喜爱程度的

POJ3189 Steady Cow Assignment(二分图多重匹配)

题意: N头牛M个棚,每头牛对每个棚都有喜爱顺序 每个棚都有自己的容量 问你怎么分配使得所有牛的喜爱程度差距最小 思路: l r表示一段喜爱程度的范围 建图就按l 到 r里的棚子建 然后两个标移动从头到尾就可以扫出最小值了 /* *********************************************** Author :devil Created Time :2016/5/17 22:28:45 ****************************************

POJ3189 Steady Cow Assignment(最大流)

题目大概说,有n头牛和b块草地,每头牛心中分别对每块草地都有排名,草地在牛中排名越高牛安排在那的幸福度就越小(...),每块草地都能容纳一定数量的牛.现在要给这n头牛分配草地,牛中的幸福度最大与幸福度最小的差值越小越好,问最小能多小. 显然又是枚举结果跑最大流看是否合法.不过,枚举幸福度的差值是做不了的,应该要枚举的是幸福度的最大值和幸福度的最小值.然后建图没啥好说的..最后的结果要加1,因为题目说“including the endpoints”,虽然不知道什么意思.. 1 #include<

Steady Cow Assignment(二分图多重匹配+二分)(网络流)

Steady Cow Assignment Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 3189 Description Farmer John's N (1 <= N <= 1000) cows each reside in one of B (1 <= B <= 20) barns which, of cou

POJ 3189 Steady Cow Assignment(最大流)

POJ 3189 Steady Cow Assignment 题目链接 题意:一些牛,每个牛心目中都有一个牛棚排名,然后给定每个牛棚容量,要求分配这些牛给牛棚,使得所有牛对牛棚的排名差距尽量小 思路:这种题的标准解法都是二分一个差值,枚举下界确定上界,然后建图判断,这题就利用最大流进行判断,值得一提的是dinic的效率加了减枝还是是卡着时间过的,这题理论上用sap或者二分图多重匹配会更好 代码: #include <cstdio> #include <cstring> #inclu

POJ 3189 Steady Cow Assignment(网络流之最大流+二分构图)

题目地址:POJ 3189 我晕啊...飞快的把白天的任务完成又有什么用...节省下来的时间活生生的被我的手残给全浪费掉了...又调了一整天,问题居然是一个地方的n和m写反了!!!反思..反思...面壁去... 这题就是二分区间,然后枚举区间位置.然后建图就行了.不多说.. 代码如下: #include <iostream> #include <stdio.h> #include <string.h> #include <stdlib.h> #include

poj 3189 Steady Cow Assignment 【最大流】【枚举上下界 判断是否满流】

Steady Cow Assignment Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6029   Accepted: 2083 Description Farmer John's N (1 <= N <= 1000) cows each reside in one of B (1 <= B <= 20) barns which, of course, have limited capacity. So

O - Steady Cow Assignment - POJ 3189(多重匹配+枚举)

题意:有N头奶牛,M个牛棚,每个牛棚都有一个容量,并且每个牛对牛棚都有一个好感度,现在重新分配牛棚,并且使好感觉最大的和最小的差值最小. 分析:好感度貌似不多,看起来可以枚举一下的样子,先试一下把 注意:枚举确实是没问题,不过那个输入需要注意一下(错了好几次才发现),比如说第二行 2 3 1 4,意思就是这个牛最中意的牛圈是2号,其次是3号...最后一行是每个牛圈能放多少牛,输出的时候要计算端点,也就是最大的rankMax-rankmin+1 **************************