隐藏页面特效

2930 填报志愿

2930 填报志愿

 

 时间限制: 1 s
 空间限制: 128000 KB
 题目等级 : 钻石 Diamond
 
 
题目描述 Description

    高考已经结束,而志愿填报正在进行中~

    吴校长的学校里有n位同学,每位同学有ki个愿意去的大学。而在吴老师的省份中,有m所大学有招生名额。根据往年的经验,对于每所大学(编号为ci),学校中最多只会有一人考上。因此为了避免志愿冲突,每年吴校长都要安排老师对同学们的志愿进行调整。

    今年吴校长找到了你来帮忙,请你编程计算,在不冲突的情况下,最多能有多少同学顺利填报志愿,填报志愿的方案又是怎样的。

输入描述 Input Description

    第一行,一个数n。

    接下来的n行,每行的第一个数为ki,接下来有ki个数,表示第i个同学愿意去的大学的编号。

    下一行,一个数m。 

    下一行,m个数,为m个大学的编号。保证大学编号递增。

输出描述 Output Description

    第一行,一个数,为在不冲突的情况下,最多能有多少同学顺利填报志愿。

    接下来的若干行,输出填报志愿的方案。每行两个数,第一个数为学生编号,第二个数为大学编号,以空格隔开。若有多种可行方案,输出字典序最小的一种。

样例输入 Sample Input

3

2 1 2

3 2 4 5

2 2 3

5

1 3 4 5 6

样例输出 Sample Output

3

1 1

2 4

3 3

数据范围及提示 Data Size & Hint

0<n<=1000,0<ki<=20,0<m<=2000,学生的编号为1~n,大学的编号为1~5000。同学愿意去的大学不一定招生。

分类标签 Tags 点此展开 

 
本题没有任何注释,因为我看了看网上都说这是典型的二分图最大匹配匈牙利算法
 
本题只需要输出方案数即可 与题目描述不同
#include<cstdio> #include<cstring> #include<iostream> using namespace std; #define N 1001 int e[N][5*N],o[5*N],vis[N],match[N]; int n,m,k,t,ans; int dfs(int u){ for(int i=1;i<=n;i++){ if(e[i][u]&&!vis[i]){ vis[i]=1; if(!match[i]||dfs(match[i])){ match[i]=u; return 1; } } } return 0; } int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&k); for(int j=1;j<=k;j++) e[i][scanf("%d",&t),t]=1; } scanf("%d",&m); for(int i=1;i<=m;i++) o[scanf("%d",&t),t]=1; for(int i=1;i<=5000;i++){ if(!o[i]) continue; memset(vis,0,sizeof vis); if(dfs(i)) ans++; } printf("%d\n",ans); return 0; }

 


__EOF__

本文作者shenben
本文链接https://www.cnblogs.com/shenben/p/5573755.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   神犇(shenben)  阅读(245)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示