hdu 3605(二分图多重匹配,匈牙利算法)

题意:有n个人可以逃到m个星球取,下面每一行有m个数,是第i个人是否可以逃到第j个星球。最后一行是m个星球最大可以生存的人数。

问是否可以全部逃离。

思路:之前二分图最大匹配是一个点最多匹配一个的,而这里每个星球可以匹配多个人。

但思路是一样的,每个人去匹配星球,如果可以匹配   并且人数小于该星球可以容纳人数就匹配,可以匹配但人数超过了,就要考虑该星球的人是否可以让位置到其他星球去,  比最大匹配多了一个for循环考虑多个人而已。

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
int mp[maxn][15];
bool used[maxn];
int cnt[maxn],cap[maxn];//cnt[i]记录现在第i个星球有多少个人,cap[i]记录 i星球的容量
int mat[maxn][15],n,m;//mat[i][j]表示第i个星球第j个匹配的人是谁 

bool dfs(int x)
{
    for(int i=0;i<m;i++)
    {
        if(mp[x][i]&&!used[i])//表示第x个人可以匹配第i个星球
        {
            used[i]=1;
            if(cnt[i]<cap[i])//并且该星球人数未上限,直接匹配
            {
                mat[i][cnt[i]++]=x;
                return true;
            }
            else//人数上限,查找该星球上所以人是否可以让位置
            {
                for(int j=0;j<cap[i];j++)
                {
                    if(dfs(mat[i][j]))//可以让位置
                    {
                        mat[i][j]=x;
                        return true;
                    }
                }
            }
        }
    }
    return false;
}

bool solve()
{
    for(int i=0;i<n;i++)//查看是否所以人可以逃离
    {
        for(int j=0;j<=m;j++)
            used[j]=0;
        if(!dfs(i))//该人不可以逃离就输出NO
            return false;
    }
    return true;
}

int main()
{
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        memset(cnt,0,sizeof(cnt));
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
                scanf("%d",&mp[i][j]);
        }
        for(int i=0;i<m;i++)
            scanf("%d",&cap[i]);
        if(solve())
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
} 

原文地址:https://www.cnblogs.com/xiongtao/p/11164632.html

时间: 2024-11-08 23:34:59

hdu 3605(二分图多重匹配,匈牙利算法)的相关文章

HDU 1669 二分图多重匹配+二分

Jamie's Contact Groups Time Limit: 15000/7000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Submission(s): 747    Accepted Submission(s): 303 Problem Description Jamie is a very popular girl and has quite a lot of friends, so she

hdu 2063 (二分匹配 匈牙利算法)

过山车 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 22693    Accepted Submission(s): 9797 Problem Description RPG girls今天和大家一起去游乐场玩,终于可以坐上梦寐以求的过山车了.可是,过山车的每一排只有两个座位,而且还有条不成文的规矩,就是每个女生必须找个个男生做par

HDU 5943 Kingdom of Obsession 【二分图匹配 匈牙利算法】 (2016年中国大学生程序设计竞赛(杭州))

Kingdom of Obsession Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 49    Accepted Submission(s): 14 Problem Description There is a kindom of obsession, so people in this kingdom do things very

HDU 3605 Escape【二分图多重匹配】

题意: 有n个人去m个星球  告诉你每个人想去哪些星球和每个星球最多容纳多少人,问能不能让所有人都满足 分析: 二分图多重匹配 代码: 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <vector> 5 using namespace std; 6 7 const int maxn = 100005; 8 const int maxm = 15; 9 10

hdu 3605 Escape (二分图多重匹配)

Escape Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4298    Accepted Submission(s): 1129 Problem Description 2012 If this is the end of the world how to do? I do not know how. But now scient

HDU 3605 Escape(二分图多重匹配问题)

Escape Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 10382    Accepted Submission(s): 2485 Problem Description 2012 If this is the end of the world how to do? I do not know how. But now scient

HDU 5352——MZL&#39;s City——————【二分图多重匹配、拆点】

MZL's City Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 710    Accepted Submission(s): 245 Problem Description MZL is an active girl who has her own country. Her big country has N cities numb

USACO 4.2 The Perfect Stall(二分图匹配匈牙利算法)

The Perfect StallHal Burch Farmer John completed his new barn just last week, complete with all the latest milking technology. Unfortunately, due to engineering problems, all the stalls in the new barn are different. For the first week, Farmer John r

hdoj 3605 Escape 【中等最大流 | 二分图多重匹配】

题目:hdoj 3605 Escape 分类:中等最大流 | 二分图多重匹配 题意:给出n个人和m个星球,每个人有想去的兴趣,然后每个星球有容量,问能不能让所有人都住在自己想去的星球? 分析:最大流的话卡的非常严,这个题目写了之后手写MTL,超内存,然后加入状态压缩之后TEL,后面没办法了看别人说C++提交能过,改C++Compilation Error,不容易呀,原来C++用的vc编译器,果然改了之后600ms过了. 首先题意很明显,建图方法也很明显,要设一个超级远点s和汇点t,其他的不说了.