二分图类题目集合

此文用来总结二分图相关知识的题目,以后遇到了就囤在一起总结吧。

最近遇到的一道最小路径覆盖的题目,其实很裸,忘了也没看出来就是最小路径覆盖。

第四届“恒生杯”程序设计大赛决赛 A

http://acm.hust.edu.cn/problem/show/1643

题意:有n个物品,每一天只能选取一些满足条件的物品,即选取的物品相邻之间要满足abs(a[i]-a[j]) >= k,问最少多少天能够选完所有物品。

分析:首先建立一个图,对于abs(a[i]-a[j])>=k的i,j(i < j)建一条i->j又向边,然后就是直接最小路径覆盖了。

每个点拆成2点i,i‘,分别表示起点和终点,对于i->j的边,拆点后连i->j‘的边,总点数n-二分图最大匹配数就是答案。

可以简单证明一下,二分图每一次匹配一条边,相当于在原图中走一步,那么我们的目标是一直走下去,走最少次数将所有的点访问完,而且每个点只能走一次。

原图对每个点走一次,最多走n次便可,现在匹配一条边后需要n-1次,这样最大匹配k条边,说明原图最少需要n-k次。最大匹配中每个点最多与一条匹配边相关联实际上就能表示,每个点只能访问一次。

代码:

 1 #include <bits/stdc++.h>
 2 #define  in  freopen("data.txt", "r", stdin);
 3 #define  bug(x) printf("Line %d:>>>>>>>>>>\n", (x));
 4
 5 using namespace std;
 6 const int maxn = 333;
 7 int vis[maxn], link[maxn], g[maxn][maxn];
 8 int a[maxn], n;
 9 bool dfs(int x) {
10     for(int y = 1; y <= n; y++) if(g[x][y]) {
11             if(vis[y]) continue;
12             vis[y] = 1;
13             if(link[y] == 0 || dfs(link[y])) {
14                 link[y] = x;
15                 return true;
16             }
17         }
18     return false;
19 }
20 int main() {
21
22     int T, k;
23     for(int t = scanf("%d", &T); t <= T; t++) {
24         scanf("%d%d", &n, &k);
25         memset(link, 0, sizeof link);
26         memset(g, 0, sizeof g);
27         for(int i = 1; i <= n; i++)
28             scanf("%d", a+i);
29         for(int i = 1; i <= n; i++)
30             for(int j = i+1; j <= n; j++)
31                 if(abs(a[i]-a[j]) >= k) g[i][j] = 1;
32         int ans = 0;
33         for(int i = 1; i <= n; i++) {
34             memset(vis, 0, sizeof vis);
35             if(dfs(i))
36                 ans++;
37         }
38         cout << n-ans << endl;
39     }
40     return 0;
41 }

时间: 2024-08-09 10:44:30

二分图类题目集合的相关文章

博弈论类题目小结——转载

出处http://blog.csdn.net/ACM_cxlove?viewmode=contents    by---cxlove 首先当然要献上一些非常好的学习资料: 基础博弈的小结:http://blog.csdn.net/acm_cxlove/article/details/7854530 经典翻硬币游戏小结:http://blog.csdn.net/acm_cxlove/article/details/7854534 经典的删边游戏小结:http://blog.csdn.net/acm

在含有null值的复杂类的集合(Collection)中取最大值

在日常编程中,经常遇到要在一组复杂类的集合(Collection)中做比较.取最大值或最小值. 举个最简单的例子,我们要在一个如下结构的集合中选取包含最大值的元素: public class Class<T> where T : struct { public T? Value { get; set; } } var ints = new List<Class<int>>() { new Class<int>() { Value = 2 }, new Cla

模拟人机交互类题目

人机交互,顾名思义,就是人与计算机间的交流互动,我们对计算机的每一次操作程序中的每一条语句都是与计算机的交流,这类题目是将人和计算机调换位置,例如猜数游戏,常规的做法是让人输入数,计算机判断大还是小,而这类人机交互题目中需要你的程序充当人来输入数据,再自己来判断大小. 例题1:猜数游戏http://codeforces.com/gym/101021 分析:范围[1,1e6],二分判断.程序输出数字,我们输入大小.(这个代码是随机数). 1 #include<bits/stdc++.h> 2 u

概率和期望类题目综合分析

先给出学习资料吧:kuangbin的博客:  https://www.cnblogs.com/kuangbin/archive/2012/10/02/2710606.html kuangbin的博客里面有3篇论文,讲的非常好,但是有点难(非常难),推荐全部打印下来 首先概率和期望类题目有哪几种做法呢? 用鬲融的总结的话有以下几种:直接计算(这样只要考验你的公式推理,一点代码都不需要)  动态规划的方法(也就是传说中的概率正着算,期望反着求)迭代的方法(其实我分不太清这样和动态规划的区别) 概率-

Java基础知识综合练习_使用集合存储_高级银行系统的搭建(注册、登录、存取款、本行转账、跨行转账、销户、特殊操作参数、多个客户对象存入到银行类的集合,多个银行对象存入总测试类集合)

Java基础知识综合练习_使用集合存储_高级银行系统的搭建(注册.登录.存取款.本行转账.跨行转账.销户.特殊操作参数.多个客户对象存入到银行类的集合,多个银行对象存入总测试类集合) 1) 定义bank类 属性有银行名称和存放客户的ArrayList集合, 有开户方法. 销户方法. 存钱方法. 取钱方法. 转账方法(本行转账.跨行转账) 2) 定义customer类 属性有账户名.密码.余额 3) 定义测试类创建一个银行集合用于存放bank对象创建几个bank对象:分别叫华夏银行.工商银行.招商

python自测——操作类题目

操作类题目 49.Python 交换两个变量的值50.在读文件操作的时候会使用 read.readline 或者 readlines,简述它们各自的作用51.json 序列化时,可以处理的数据类型有哪些?如何定制支持 datetime 类型?52.json 序列化时,默认遇到中文会转换成 unicode,如果想要保留中文怎么办?53.有两个磁盘文件 A 和 B,各存放一行字母,要求把这两个文件中的信息合并(按字母顺序排列),输出到一个新文件 C 中.54.如果当前的日期为 20190530,要求

Random类&amp;ArrayList集合学习

基础题目 第一题:需求实现 随机验证码. 随机生成十组六位字符组成的验证码. 验证码由大小写字母.数字字符组成. 代码实现,效果如图所示: 开发提示: 使用字符数组保存原始字符,利用Random类生成随机索引. 参考答案: public class Test1 { public static void main(String[] args) { for (int i = 0; i < 10; i++) { String s = verifyCode(); System.out.println(&qu

Java面试题目集合

有链接的都是引用别人的知识点. 1.equals方法用于比较对象的内容是否相等(覆盖以后) 2.hashcode方法只有在集合中用到 3.当覆盖了equals方法时,比较对象是否相等将通过覆盖后的equals方法进行比较(判断对象的内容是否相等). 4.将对象放入到集合中时,首先判断要放入对象的hashcode值与集合中的任意一个元素的hashcode值是否相等, 如果不相等直接将该对象放入集合中.如果hashcode值相等,然后再通过equals方法判断要放入对象与集合中的 任意一个对象是否相

c# 将匿名类或者集合转Json格式数据一些方法

要说写这个功能呢也是因为工作需要,白天呢上班写个Web页面需要ajax请求后台并将数据以Json格式传会前端,由于公司特殊性吧,不能连外网(很苦比).所以只有等到晚上回家上网边查边写! public class DataToJson { private static System.Web.Script.Serialization.JavaScriptSerializer ser = new System.Web.Script.Serialization.JavaScriptSerializer(