hdu 二分图最大匹配问题 (hdu 1083)
给定一个二分图G,M为G边集的一个子集,如果M满足当中的任意两条边都不依附于同一个顶点,则称M是一个匹配。
最大匹配即最大的匹配个数。
关于二分匹配的基本问题:http://www.cnblogs.com/heat-man/archive/2013/03/26/2982644.html
hdu 1083 courses(http://acm.hdu.edu.cn/showproblem.php?pid=1083)
本题题目叙述有点乱,英语不好看了很久,有p门课,n个学生,每个学生可以选修1-p门课,给出了每一门课的学生选择信息(学生的序号),现在要成一个委员会,需满足每一门课都有一个选修了该课程的学生来做代表,每个学生只能代表一门课程,问能否组成委员会,如果能,则输出“YES”,否则“NO”;
二分图的最大匹配问题,以课程-学生建立二分图,求出最大匹配数等于课程数即满足。

1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 using namespace std; 5 #define N 305 6 int match[N][N]; 7 int mark[N]; 8 int visted[N]; 9 int n,p; 10 int t ; 11 int DFS(int x) 12 { 13 int j; 14 for(j=1;j<=n;j++) 15 { 16 if(!visted[j]&&match[x][j]==1) 17 { 18 visted[j]=1; 19 if(!mark[j]||DFS(mark[j])) 20 { 21 mark[j]=x; 22 return 1; 23 } 24 } 25 } 26 return 0; 27 } 28 int main() 29 { 30 //freopen("input.txt","r",stdin); 31 // freopen("output.txt","w",stdout); 32 scanf("%d",&t); 33 while(t--) 34 { 35 36 memset(match,0,sizeof(match)); 37 memset(mark,0,sizeof(mark)); 38 scanf("%d%d",&p,&n); 39 if(p>n) 40 { 41 printf("NO\n"); 42 continue ; 43 } 44 int i; 45 for(i=1;i<=p;i++) 46 { 47 int num; 48 int j; 49 scanf("%d",&num); 50 for(j=1;j<=num;j++) 51 { 52 int a; 53 scanf("%d",&a); 54 match[i][a]=1; 55 56 } 57 } 58 int ans=0; 59 for(i=1;i<=p;i++) 60 { 61 memset(visted,0,sizeof(visted)); 62 if(DFS(i)) 63 ans++; 64 } 65 if(ans==p) 66 printf("YES\n"); 67 else 68 printf("NO\n"); 69 } 70 return 0; 71 }
标签:
hdu 二分图的最大匹配
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?