hdu 3605(多重匹配)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3605

题意:

世界末日即将到来,地球上有n个人想转移到m个外星球,但是不同的人适应于不同的星球(1个人可适应多个星球),每个外星球都有人数的限制,现在给你星球人数的上限。还有每个人不同的适应情况。问,能否安排所有的人都成功地转移到外星球上。

思路:多重匹配。。。

复制代码
View Code
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 #define MAXN 100000+10
 6 #define MAXM 12
 7 
 8 bool map[MAXN][MAXM];
 9 int cap[MAXM];//i最多能匹配的上限
10 int link[MAXM];//i当前的匹配数
11 int vlink[MAXM][MAXN];//与i匹配的第j个匹配的数k;
12 bool mark[MAXM];//标记的是已匹配的planet;
13 int n,m;
14 
15 bool dfs(int k){
16     for(int i=1;i<=m;i++){
17         if(!mark[i]&&map[k][i]){
18             mark[i]=true;
19             if(link[i]<cap[i]){
20                 vlink[i][link[i]]=k;
21                 link[i]++;
22                 return true;
23             }
24             //如果没有满足匹配要求的,重新匹配
25             for(int j=0;j<link[i];j++){
26                 if(dfs(vlink[i][j])){
27                     vlink[i][j]=k;
28                     return true;
29                 }
30             }
31         }
32     }
33     return false;
34 }
35 
36 
37 int main(){
38     while(~scanf("%d%d",&n,&m)){
39         for(int i=1;i<=n;i++){
40             for(int j=1;j<=m;j++){
41                 scanf("%d",&map[i][j]);
42             }
43         }
44         for(int i=1;i<=m;i++)scanf("%d",&cap[i]);
45         memset(link,0,sizeof(link));
46         memset(vlink,0,sizeof(vlink));
47         bool flag=true;
48         for(int i=1;i<=n;i++){
49             memset(mark,false,sizeof(mark));
50             if(!dfs(i)){flag=false;break;}
51         }
52         flag?puts("YES"):puts("NO");
53     }
54     return 0;
55 }
复制代码

 

posted @   ihge2k  阅读(175)  评论(0编辑  收藏  举报
编辑推荐:
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
阅读排行:
· 如何给本地部署的DeepSeek投喂数据,让他更懂你
· 超详细,DeepSeek 接入PyCharm实现AI编程!(支持本地部署DeepSeek及官方Dee
· 用 DeepSeek 给对象做个网站,她一定感动坏了
· .NET 8.0 + Linux 香橙派,实现高效的 IoT 数据采集与控制解决方案
· .NET中 泛型 + 依赖注入 的实现与应用
点击右上角即可分享
微信分享提示