HDU 2063 过山车(二分匹配入门)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2063
二分匹配最大匹配数简单题,匈牙利算法。学习二分匹配传送门:http://blog.csdn.net/dark_scope/article/details/8880547
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <vector> 5 using namespace std; 6 const int N = 1e3 + 5; 7 struct Edge { 8 int to , next; 9 }edge[N]; 10 int head[N] , match[N] , cnt; //match 右集合对应左集合的编号 11 bool vis[N]; 12 13 void init() { 14 memset(head , -1 , sizeof(head)); 15 memset(match , 0 , sizeof(match)); 16 cnt = 0; 17 } 18 19 inline void add(int u , int v) { 20 edge[cnt].next = head[u]; 21 edge[cnt].to = v; 22 head[u] = cnt++; 23 } 24 25 bool dfs(int u) { 26 for(int i = head[u] ; ~i ; i = edge[i].next) { 27 int v = edge[i].to; 28 if(!vis[v]) { //没有查找过 29 vis[v] = true; 30 if(!match[v] || dfs(match[v])) { //没有匹配过 或者试着可以腾出位子来匹配 31 match[v] = u; 32 return true; //匹配成功 33 } 34 } 35 } 36 return false; 37 } 38 39 int hungry(int n) { 40 int res = 0; 41 for(int i = 1 ; i <= n ; ++i) { 42 memset(vis , false , sizeof(vis)); 43 if(dfs(i)) 44 res++; 45 } 46 return res; 47 } 48 49 int main() 50 { 51 int k , n , m , u , v; 52 while(~scanf("%d" , &k) && k) { 53 scanf("%d %d" , &n , &m); 54 init(); 55 for(int i = 0 ; i < k ; ++i) { 56 scanf("%d %d" , &u , &v); 57 add(u , v); 58 } 59 printf("%d\n" , hungry(n)); 60 } 61 return 0; 62 }
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 继承的思维:从思维模式到架构设计的深度解析
· 如何在 .NET 中 使用 ANTLR4
· 后端思维之高并发处理方案
· 理解Rust引用及其生命周期标识(下)
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· Cursor预测程序员行业倒计时:CTO应做好50%裁员计划
· 当职场成战场:降职、阴谋与一场硬碰硬的抗争
· 用99元买的服务器搭一套CI/CD系统
· Excel百万数据如何快速导入?
· 35岁程序员的中年求职记:四次碰壁后的深度反思