BZOJ 1191: [HNOI2006]超级英雄Hero【二分图匹配】

本文介绍了一种经典的二分图匹配问题,并通过匈牙利算法实现了解决方案。问题涉及N个人和M个职位,目标是最大化分配工作的数量。文章还提供了具体的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

裸的匹配题,一眼就能看出来二分图的模型,是某个经典题的改编。貌似某本图论书上讲过的,有N个人以及M个职位,每个职位只能提供给一个人,而每个人由于能力有限只能胜任有限个职位,问是否有办法使得每个人都有工作,如果不能,最多能给多少个人提供工作。如果看过这道经典题的话,这题的思路就顺秒了:将n道题看成n个点属于二分图的x部,将m个锦囊看成m个点属于y部,用匈牙利算法做这个二部图的匹配,当某个点不能匹配时算法结束

值的一说的是,由于这个二部图的特性,x部每个点有且仅有2条边与y部相连,利用这个特性能够大大优化这个算法(下面这个程序属于无脑敲的匈牙利,没用这个优化。。。。竟然也能过)

#include<iostream>

#include<cstdio>

#include <math.h>

#include <string.h>

using namespace std;

intmatch[1009],visit[1009]={0},n,map[1009][1009]={0};

int dfs(int k)

{

    for (int i=0;i<=n-1;i++)

    {

       if (map[k][i]==1 && visit[i]==0)

       {

            visit[i]=1;

            if ((match[i]==-1) || (dfs(match[i])==1))

            {

                  match[i]=k;

                  return 1;

            }

       }

       

    }

   return 0;

}

int main()

{

   int m,ans=0,x,y;

    scanf("%d%d",&n,&m);

    for (int i=1;i<=m;i++)

    {

       scanf("%d%d",&x,&y);

        map[i][x]=1;

       map[i][y]=1;

    }

   memset(match,255,sizeof(match));

    for (inti=1;i<=m;i++)

    {

        memset(visit,0,sizeof(visit));

        if (dfs(i)==1)ans++;else break;

    }

   printf("%d",ans);

   scanf("%d%d",&n,&m);

    return0;

}

转载于:https://www.cnblogs.com/philippica/p/4006944.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值