题目链接:http://poj.org/problem?id=1469

题目意思:有 N 个人,P个课程,每一个课程有一些学生参加(0个、1个或多个参加)。问 能否使得 P 个课程 恰好与 P 个学生相匹配。

受之前第一道匹配题(POJ 1274 The Perfect Stall)的影响,没有仔细体会是从哪个点匹配到哪个点,这将导致Hungary() 和 dfs() 中 for 循环的约束条件,究竟是遍历课程数 P 还是 学生数N,不要搞混!其实从存储的map[i][j] 可以 知道 怎样遍历的啦 ^_^

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 using namespace std;
 5
 6 const int maxn = 300 + 5;
 7 bool vis[maxn];
 8 int map[maxn][maxn], match[maxn];
 9 int N, P, cnt;
10
11 int dfs(int x)
12 {
13     for (int i = 1; i <= N; i++)   // 为p个课程找匹配,N个学生是候选人
14     {
15         if (!vis[i] && map[x][i])
16         {
17             vis[i] = 1;
18             if (!match[i] || dfs(match[i]))
19             {
20                 match[i] = x;
21       //          printf("match[%d] = %d\n", i, match[i]);
22                 return 1;
23             }
24         }
25     }
26     return 0;
27 }
28
29 void Hungary()
30 {
31     cnt = 0;
32     for (int i = 1; i <= P; i++)  // 不是N,要区分清楚!!
33     {
34         memset(vis, 0, sizeof(vis));
35         cnt += dfs(i);
36     }
37 }
38
39 int main()
40 {
41     int T, stu_num, stu_id;
42     while (scanf("%d", &T) != EOF)
43     {
44         while (T--)
45         {
46             memset(match, 0, sizeof(match));
47             memset(map, 0, sizeof(map));
48
49             scanf("%d%d", &P, &N);
50             for (int i = 1; i <= P; i++)
51             {
52                 scanf("%d", &stu_num);
53                 for (int j = 0; j < stu_num; j++)
54                 {
55                     scanf("%d", &stu_id);
56                     map[i][stu_id] = 1;
57                 }
58             }
59             Hungary();
60             printf("%s\n", cnt == P ? "YES" : "NO");
61         }
62     }
63     return 0;
64 }

转载于:https://www.cnblogs.com/windysai/p/3917080.html

poj 1469 COURSES 解题报告相关推荐

  1. POJ 2745 显示器 解题报告

    POJ 2745 显示器 解题报告 编号:2745   考查点:模拟 思路:抽象出来,计算器显示是7个笔画,然后建立数组表示各笔画被覆盖情况,不过这个是我看了书之后实现的,方法果真经典. 提交情况:比 ...

  2. poj 1469 COURSES

    2019独角兽企业重金招聘Python工程师标准>>> COURSES Time Limit: 1000MS Memory Limit: 10000K Total Submissio ...

  3. poj 1459-Power Network解题报告

    链接:http://poj.org/problem?id=1459 网络流的压入重标记算法模板,完全按照算法导论的模式打出来的,没有什么优化之类的,只是为了给自己打模板,要省赛了,加油啊. View ...

  4. POJ 1002题 解题报告

    这个是超时版的: #include<iostream> #include<string> using namespace std; typedef struct Telepho ...

  5. 利用匈牙利算法Hopcroft-Karp算法解决二分图中的最大二分匹配问题 例poj 1469 COURSES...

    首先介绍一下题意:已知,有N个学生和P门课程,每个学生可以选0门,1门或者多门课程,要求在N个学生中选出P个学生使得这P个学生与P门课程一一对应. 这个问题既可以利用最大流算法解决也可以用匈牙利算法解 ...

  6. POJ - 1469 COURSES (匈牙利算法入门题)

    题意: P门课程,N个学生.给出每门课程的选课学生,求是否可以给每门课程选出一个课代表.课代表必须是选了该课的学生且每个学生只能当一门课程的. 题解: 匈牙利算法的入门题. #include < ...

  7. POJ 1469 COURSES 二分图最大匹配

    就是判断一下是不是每一个课程都能找到自己的代表人,做一遍最大匹配看看匹配数是否等于p即可 #include <cstdio> #include <cstring> #inclu ...

  8. POJ 2240 Arbitrage 解题报告

    Question Link 单向图,就是bellman-ford求正环,但是应该预设起点的钱的值为1,或者任意正数.起点暴力,枚举.好吧(其实我是真的傻了). 傻傻的代码 #include<io ...

  9. POJ 2800 垂直直方图 解题报告

    POJ 2800 垂直直方图 解题报告 编号:2800   考查点:简单计算题 思路: 用gets()读入4行数据,然后按字符统计,显示的时候有点小处理即可. 提交情况: 感觉POJ的测试数据有点骗人 ...

最新文章

  1. php excel 追加写入,phpexcel写入追加已有的excel文件
  2. autofs一个神奇的服务
  3. 61 MM配置-后勤发票校验-发票冻结-设置容差限制
  4. 【UVALive】3029 City Game(悬线法)
  5. Memcached学习---(1) 教程
  6. 单个字段中根据条件剔除数据
  7. linux 核显驱动程序,在Ubuntu系统上安装英特尔核显驱动安装器的方法
  8. 01 Conv-TasNet论文分享
  9. 三大突破让人工智能终成现实
  10. 良心推荐:最适合玩吃鸡手游的安卓机型有哪些?刺激战场为例
  11. pwm调速流程图小车_求智能小车 PWM调速?
  12. [转载] 百科全说——陈焕然:揭秘高科技美容(10-02-22)
  13. 可以旅游了_原水_新浪博客
  14. 1024,祝所有程序员节日快乐
  15. 基于python+vue+elementUI高校社团管理系统(前后端分离)#毕业设计
  16. go-gorilla的ping pong
  17. 第0章 计算机硬件与组成基础
  18. 女工程师独家揭秘:双11秘密武器阿里云数据库团队故事
  19. 2021/8/13 又回到最初的起点
  20. 怎么提高网站的流量 做好这10点

热门文章

  1. Problem H: tmk买礼物
  2. .NET Core的介绍
  3. 浅谈Java中的数据类型以及面向对象
  4. 第十一篇 SpringBoot 2 x整合Swagger2
  5. 程序员的能力矩阵表【转载自】
  6. Oracle八大性能视图之v$sort_usage_temp
  7. MySQL -> ES 数据同步 配置步骤
  8. Android Studio修改编译JDK
  9. Android 显示全文折叠控件
  10. 作用域链(scope chain)和原型链(prototype chain)