摘要: 题意:删去最少的边,使图中不存在奇圈。分析:一开始想用BFS求出哪些点同时存在于两个集合再进行处理,发现行不通。但从数据的范围来看(N≤15,M≤300),这么少的数据可以直接枚举这些点分成两个集合的所有情况,最多2^15种,然后看看哪种情况删除的边数最少的就是答案。View Code 1 #include<cstdio> 2 int t,n,m; 3 int matrix[16][16]; 4 int solve(int set) 5 { 6 int counter=0; 7 for(int i=0;i<n;i++) 8 { 9 if((set&(1... 阅读全文
posted @ 2013-03-16 23:17 Hogg 阅读(371) 评论(0) 推荐(0) 编辑
摘要: 题目:Problem Description这是一个简单的游戏,在一个n*n的矩阵中,找n个数使得这n个数都在不同的行和列里并且要求这n个数中的最大值和最小值的差值最小。Input输入一个整数T表示T组数据。对于每组数据第一行输入一个正整数n(1<=n<=100)表示矩阵的大小。接着输入n行,每行n个数x(0<=x<=100)。Output对于每组数据输出一个数表示最小差值。分析:要在不同行不同列中找n个数,很容易想到用二分匹配。但是要这n个数的最大值和最小值的差值最小就比较麻烦了。其实,这个时候应该要想想枚举的方法能不能做得出这个题目了。枚举差值,再在每一个差值里面枚 阅读全文
posted @ 2013-03-16 23:10 Hogg 阅读(433) 评论(0) 推荐(0) 编辑
摘要: 题意:在一个矩形城市里面,有间出租车公司收到翌日的预订行程M个,每个给出起点、终点坐标,两个地点之间的车程就是那两个点之间的曼哈顿距离,车起码要在一个行程的出发时间前一分钟到起点。求最少要多少出租车才够完成所有预订?分析:每个起点的出发时间是确定的,起点与终点之间的距离也是确定的,因此每个行程的开始和结束的时间地点都是确定的。记A,B是两个行程的起点,A',B'分别是终点,假如由A'到B的时间还在B的规定时间前,那么要走完AA',BB'要用的出租车就只需要一台。把起点与终于合成一个点(这样每个点就是一个行程),若A后能接上B则添加一条有向边<A,B 阅读全文
posted @ 2013-03-14 16:19 Hogg 阅读(343) 评论(0) 推荐(0) 编辑
摘要: 题意:N个星球之间存在M条单向通道(不构成圈),同一个星球可能出现在两条不同的路径中。现用若干个机器人走遍所有星球,每个机器人的起点任意,最少要多少个机器人?分析:这是poj1422的升级版,在有交叉的情况下,标准的最小路径覆盖不适用(例如:1→2,2→3,4→2,2→5,当有了(1,2),(2,3)这个匹配时,2就被删去了,算出的答案是3,而这种情况答案应是2),所以要加一个floyd,求出各顶点的可达矩阵。View Code 1 #include<cstdio> 2 int mat[2][501]; 3 bool visited[501],matrix[501][501]; 4 阅读全文
posted @ 2013-03-14 14:47 Hogg 阅读(300) 评论(0) 推荐(0) 编辑
摘要: 题意:一个城市里的路都是单向的,这些路不构成环,每个交点都只属于一条路径。伞兵可以在任意一个交点着陆,问最少要多少个伞兵才能把所有交点都访问到?分析:这是一个最小路径覆盖问题。最小路径覆盖数=顶点数-最大匹配。至于公式是如何证明的,还是似懂非懂。参考资料:http://hi.baidu.com/oksbqoyifkbfirq/item/ebfe96c8a85f7844a9ba94b0View Code 1 #include<cstdio> 2 int mat[2][500]; 3 bool visited[500],matrix[500][500]; 4 int nx,ny,k; 阅读全文
posted @ 2013-03-13 09:58 Hogg 阅读(250) 评论(0) 推荐(0) 编辑
摘要: 题意:一个由r行c列方格组成的田地,里面有若干个方格充满泥泞,其余方格都是草。要用长度不限,宽度为1的长木板来覆盖这些泥方格,但不能覆盖草地。最少要用多少个长木板?分析:由于不能覆盖草地,这道题显得相当难。看别人的题解看了很久才明白它是如何跟二分匹配联系在一起的。这个建图实在是精妙。我们先把同一行每一段连续的泥方格作为一个顶点(其实就是一个长木板),这些顶点放进去集合x;而同一列每一段连续的泥方格也作为一个顶点,放进集合y。a∈x,b∈y,a,b若有相交则建一条边(a,b)。巧妙之处就在这条边,每条边所表示的就是原来的图中的一个泥方格,边与泥方格存在一一对应关系。若选了a(a∈x或a∈y)木板 阅读全文
posted @ 2013-03-11 22:02 Hogg 阅读(850) 评论(0) 推荐(1) 编辑
摘要: Shooting Contest题意:r行c列的矩阵上,每列有两个白色点,用c发子弹打到矩阵上的点,能否使每列有且只有一个白点被击中而每行起码有一个白点被击中(这个题意当初没理解好,纠结一个下午都不知道为什么WA)?若能,则求其中一个白点组合;不能则输出“NO”。分析:受人指教,这个图可以把行作为一个集合,列作为一个集合,若第i行第j列是白色的,则有边(i,j),可以保证这样的图是二分图。只要在这个图里求出最大匹配(在匹配的情况下,每列都只会选到一行),匹配数等于r则能满足条件(有匹配的列都直接输出匹配点,注意c可能大于r,因此没匹配到的列里每列随便拿出一个白点就能得出解)。View Code 阅读全文
posted @ 2013-03-08 18:27 Hogg 阅读(262) 评论(0) 推荐(0) 编辑
摘要: Girls and Boys题意:有人想对学校里面的男女学生做暧昧关系做研究,要将没有暧昧关系的学生分到同一个组里面,问一个组最大人数是多少。分析:每两个节点之间都不相邻,也就是求二分图最大点独立数。在没有孤立点的二分图里,最大点独立数=n-最大匹配数。View Code 1 #include<cstdio> 2 #include<vector> 3 using namespace std; 4 vector<int> vex[500],group; 5 int n,m,max_match,sum,mat[500],set[500],counter; 6 b 阅读全文
posted @ 2013-03-06 20:23 Hogg 阅读(175) 评论(0) 推荐(0) 编辑
摘要: Father Christmas flymouse题意:飞鼠想给大家发礼物,收到礼物后大家给飞鼠的满足程度都已数量化(有正有负)。每个人都住一个房间,房间之间的路是单向的,飞鼠可以选任一个点为起点,路可以重复走,房间不能重复访问,但可以经过而不访问。现在问飞鼠得到的满足程度最大会是多少?分析:负分的房间肯定不访问。强连通分支可以缩点,缩成的点的分数取所有正分房间的总和,缩点后的图就变成若干个单向连通分支,由出度为零的点倒推即可算得最大值。View Code 1 #include<cstdio> 2 #include<vector> 3 #include<stack 阅读全文
posted @ 2013-03-05 13:14 Hogg 阅读(376) 评论(0) 推荐(0) 编辑
摘要: 很久很久没有写过题解了,题解还是要多写,要多总结。题意:Wiskey知道他所有朋友的联系方式,知道他的朋友都有谁的联系方式,也知道联系他们要用的话费。现在他要通知所有朋友,最少要通知多少人,最少用多少电话费才够?Input多组测试数组,以EOF结束。第一行两个整数N和M(1<=N<=1000, 1<=M<=2000),表示人数和联系对数。接下一行有N个整数,表示Wiskey联系第i个人的电话费用。接着有M行,每行有两个整数X,Y,表示X能联系到Y,但是不表示Y也能联系X。 Output输出最小联系人数和最小花费。每个CASE输出答案一行。分析:一开始以为人数最少和话费最 阅读全文
posted @ 2013-03-04 14:12 Hogg 阅读(202) 评论(0) 推荐(0) 编辑