热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

网络流24题——试题库问题

题目描述:假设一个试题库中有n道试题。每道试题都标明了所属类别。同一道题可能有多个类别属性。现要从题库中抽取m道题组成试卷。并要求试卷包含指定类型的试题。试设计一个满足要求的组卷算

题目描述:

假设一个试题库中有n道试题。每道试题都标明了所属类别。同一道题可能有多个类别属性。现要从题库中抽取m 道题组成试卷。并要求试卷包含指定类型的试题。试设计一个满足要求的组卷算法。


洛谷上这题是紫题,觉得有点过分了,建模很好想,借用一张图,侵删

技术分享图片

 

  跑个最大流就行了


dinic代码:

技术分享图片技术分享图片

1 #include
2 #define N 100010
3 #define inf 2147483647
4 #define ll long long
5 using namespace std;
6 int q[N];
7 int n,k,cnt,st,t,m;
8 int dis[200000],ans,head[N];
9 bool vis[200000];
10 struct node
11 {
12 int nex,to,val;
13 }e[N];
14
15 void add(int x,int y,int z)
16 {
17 e[++cnt].nex=head[x];
18 e[cnt].to=y;
19 e[cnt].val=z;
20 head[x]=cnt;
21 }
22
23 void ins(int x,int y,int z)
24 {
25 add(x,y,z);add(y,x,0);
26 }
27
28 bool bfs()
29 {
30 memset(dis,-1,sizeof(dis));
31 int l=0,r=1,u;
32 q[0]=dis[0]=0;
33 while (l<r)
34 {
35 u=q[l++];
36 for (int i=head[u];i;i=e[i].nex)
37 {
38 int ne=e[i].to;
39 if (dis[ne]==-1&&e[i].val)
40 {
41 q[r++]=ne;
42 dis[ne]=dis[u]+1;
43 }
44 }
45 }
46 if (dis[t]==-1) return false;
47 return true;
48 }
49
50 int dfs(int u,int flow)
51 {
52 int w,used=0;
53 if (u==t) return flow;
54 for (int i=head[u];i;i=e[i].nex)
55 {
56 int ne=e[i].to;
57 if (dis[ne]==dis[u]+1&&e[i].val)
58 {
59 w=flow-used;
60 w=dfs(ne,min(w,e[i].val));
61 e[i].val-=w,e[i^1].val+=w;
62 used+=w;
63 if (used==flow) return flow;
64 }
65 }
66 if (!used) dis[u]=-1;
67 return used;
68 }
69
70 void dinic()
71 {
72 while (bfs())
73 ans+=dfs(st,inf);
74 }
75 int main()
76 {
77 scanf("%d%d",&k,&n);
78 st=0,t=8001;
79 for (int i=1;i<=k;i++)
80 {
81 int x;
82 scanf("%d",&x);
83 ins(st,i,x);
84 m+=x;
85 }
86 for (int i=1;i<=n;i++)
87 {
88 int ty;
89 scanf("%d",&ty);
90 for (int j=1;j<=ty;j++)
91 {
92 int tmp;
93 scanf("%d",&tmp);
94 ins(tmp,i+k,1);
95 }
96 ins(i+k,t,1);
97 }
98 dinic();
99 if (ans==m)
100 {
101 for (int i=1;i<=k;i++)
102 {
103 printf("%d: ",i);
104 for (int j=head[i];j;j=e[j].nex)
105 {
106 if (e[j].to>0&&!e[j].val)
107 printf("%d ",e[j].to-k);
108 }
109 cout<<endl;
110 }
111 }
112 else printf("No Solution!\n");
113 return 0;
114 }


View Code

 


推荐阅读
  • 本文探讨了在使用Selenium进行自动化测试时,由于webdriver对象实例化位置不同而导致浏览器闪退的问题,并提供了详细的代码示例和解决方案。 ... [详细]
  • 本文介绍如何在 C++ 中使用链表结构存储和管理数据。通过具体示例,展示了静态链表的基本操作,包括节点的创建、链接及遍历。 ... [详细]
  • 本问题探讨了在特定条件下排列儿童队伍的方法数量。题目要求计算满足条件的队伍排列总数,并使用递推算法和大数处理技术来解决这一问题。 ... [详细]
  • 本文深入探讨了线性代数中向量的线性关系,包括线性相关性和极大线性无关组的概念。通过分析线性方程组和向量组的秩,帮助读者理解这些概念在实际问题中的应用。 ... [详细]
  • 本文旨在提供一套高效的面试方法,帮助企业在短时间内找到合适的产品经理。虽然观点较为直接,但其方法已被实践证明有效,尤其适用于初创公司和新项目的需求。 ... [详细]
  • 本文探讨了使用C#在SQL Server和Access数据库中批量插入多条数据的性能差异。通过具体代码示例,详细分析了两种数据库的执行效率,并提供了优化建议。 ... [详细]
  • 反向投影技术主要用于在大型输入图像中定位特定的小型模板图像。通过直方图对比,它能够识别出最匹配的区域或点,从而确定模板图像在输入图像中的位置。 ... [详细]
  • 深入理解Lucene搜索机制
    本文旨在帮助读者全面掌握Lucene搜索的编写步骤、核心API及其应用。通过详细解析Lucene的基本查询和查询解析器的使用方法,结合架构图和代码示例,带领读者深入了解Lucene搜索的工作流程。 ... [详细]
  • 在项目部署后,Node.js 进程可能会遇到不可预见的错误并崩溃。为了及时通知开发人员进行问题排查,我们可以利用 nodemailer 插件来发送邮件提醒。本文将详细介绍如何配置和使用 nodemailer 实现这一功能。 ... [详细]
  • Appium + Java 自动化测试中处理页面空白区域点击问题
    在进行移动应用自动化测试时,有时会遇到某些页面没有返回按钮,只能通过点击空白区域返回的情况。本文将探讨如何在Appium + Java环境中有效解决此类问题,并提供详细的解决方案。 ... [详细]
  • 如何清除Chrome浏览器地址栏的特定历史记录
    在使用Chrome浏览器时,你可能会发现地址栏保存了大量浏览记录。有时你可能希望删除某些特定的历史记录而不影响其他数据。本文将详细介绍如何单独删除地址栏中的特定记录以及批量清除所有历史记录的方法。 ... [详细]
  • 利用Selenium与ChromeDriver实现豆瓣网页全屏截图
    本文介绍了一种使用Selenium和ChromeDriver结合Python代码,轻松实现对豆瓣网站进行完整页面截图的方法。该方法不仅简单易行,而且解决了新版Selenium不再支持PhantomJS的问题。 ... [详细]
  • 算法题解析:最短无序连续子数组
    本题探讨如何通过单调栈的方法,找到一个数组中最短的需要排序的连续子数组。通过正向和反向遍历,分别使用单调递增栈和单调递减栈来确定边界索引,从而定位出最小的无序子数组。 ... [详细]
  • 本文详细探讨了JavaScript中的作用域链和闭包机制,解释了它们的工作原理及其在实际编程中的应用。通过具体的代码示例,帮助读者更好地理解和掌握这些概念。 ... [详细]
  • C#设计模式学习笔记:观察者模式解析
    本文将探讨观察者模式的基本概念、应用场景及其在C#中的实现方法。通过借鉴《Head First Design Patterns》和维基百科等资源,详细介绍该模式的工作原理,并提供具体代码示例。 ... [详细]
author-avatar
手机用户2502927987
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有