上一页 1 ··· 17 18 19 20 21 22 23 24 25 ··· 34 下一页
摘要: 感觉这俩个博客真的解释的太好了,今天有点恍然大悟的感觉http://cuitianyi.com/blog/%E6%B1%82%E6%9C%80%E5%A4%A7%E6%9D%83%E4%BA%8C%E5%88%86%E5%8C%B9%E9%85%8D%E7%9A%84km%E7%AE%97%E6%B3%95/http://www.byvoid.com/blog/match-km/最大权二分匹配问题就是给二分图的每条边一个权值,选择若干不相交的边,得到的总权值最大。解决这个问题可以用KM算法。理解KM算法需要首先理解“可行顶标”的概念。可行顶标是指关于二分图两边的每个点的一个值lx[i]或ly[ 阅读全文
posted @ 2011-09-04 09:26 枕边梦 阅读(445) 评论(0) 推荐(0) 编辑
摘要: 模板题来的,构完图之后就是直接的模板了,可惜对于这个算法还是了解的不够深…………若求得的是最大匹配,则将权值为正,若为最小匹配,则将权值该为相反数此模板默认所有数组默认下标从1 开始,复杂度O(n^3)mat 表示邻接矩阵,nx,ny表示二分的大小lx,ly表示为顶标,fx[i],fy[i]标记十分访问过该点mx[i],my[i] 表示匹配先贴模板:KM算法模板#include <iostream>using namespace std;const int MAXN = 110;const int INF = 0x7FFFFFFF;int nx, ny, w[MAXN][MAXN] 阅读全文
posted @ 2011-09-03 23:29 枕边梦 阅读(247) 评论(0) 推荐(0) 编辑
摘要: 题意:给定N张幻灯片的maxx,minx,maxy,miny,和N个点的位置,表示幻灯片的编号,编号写在幻灯片上,问幻灯片与编号形成的最大匹配能否确定唯一的匹配,输出已确定的唯一匹配;分析:若编号与幻灯片满足 minx<x<maxx, miny<y<maxy,则形成一个可能的匹配,求出最大匹配(肯定是完美匹配的)之后,再依次判定该匹配边是否为必须边判定方法:先将该匹配边删除,判定从该点出发是否存在增广路径,若存在,则不是必须边,反之,为必须边;#include<iostream>using namespace std;bool mat[26][26],vis 阅读全文
posted @ 2011-09-02 09:36 枕边梦 阅读(301) 评论(2) 推荐(0) 编辑
摘要: 几道简单的关于素数的题目,嘿嘿,基本都是用了筛选法pku3006#include<iostream>#include<math.h>#define MAXN 1000001using namespace std;bool prime[MAXN];void init(){ prime[1]=false; prime[2]=true; for(int i=3; i<MAXN; i++) if(i%2) prime[i]=true; else prime[i]=false; for(int i=3; i<=sqrt((double)MAXN); i++) ... 阅读全文
posted @ 2011-09-02 09:19 枕边梦 阅读(173) 评论(0) 推荐(0) 编辑
摘要: 题意:修理公司的工人可以给城市中不同的工厂修理工具。给出各个工厂路径的邻接矩阵,和总任务数,还有每个工厂的工具修理需要的开始时间结束时间。问最少派出多少个工人可以完成所有任务?分析:跟pku2060几乎是一样的题目,只不过得用一次floyd算法任意俩点之间的最短路径View Code #include<iostream>using namespace std;int inf = 100000000;struct Task{ int q; int s; int t;}; Task tt[205];char mat[205][205];char vstd[205... 阅读全文
posted @ 2011-08-30 16:17 枕边梦 阅读(221) 评论(0) 推荐(0) 编辑
摘要: 题意:给一个有向无环图,求最小的路径数覆盖每个顶点至少一次分析:很明显的一道最小路径覆盖,可是稍微有些不同的是:“You should notice that the roads of two different robots may contain some same point. ”标准的最小路径覆盖是不允许有相交的路径,所以将所以有可以相连的间接的路径直接相连起来,即在求最大匹配之前,用一次floyd 算法即可#include<iostream>using namespace std;bool map[501][501],vis[501];int match[501],n;i 阅读全文
posted @ 2011-08-30 14:42 枕边梦 阅读(335) 评论(0) 推荐(0) 编辑
摘要: 题意:出租车可以不停地做任务,任务是在一定时间内,把车从一个地方开到另一个地方。给出各项任务的具体时间和地点,问最少需要多少辆出租车来做任务?分析:首先,因为是在做二分匹配,所以肯定知道是用二分匹配做啦,如果是偶然遇到,真的不敢保证我能想到用二分匹配做;既然用二分匹配做,那么首先就是构图啦,怎样建立匹配关系呢?就是在任务之间建立关系,把任何可能衔接在一起的任务当做一个匹配,那么很明显,接下来就是求这个图的一个最小路径覆盖了,求最小的路径覆盖所有的点,即完成所有的任务;最小路径覆盖==点的个数-最大匹配下面在计算时间的时候,将所有时间都转换成分了,这样少了很多判断了#include<ios 阅读全文
posted @ 2011-08-29 23:06 枕边梦 阅读(339) 评论(0) 推荐(0) 编辑
摘要: pku 3014题意:有个r行c列的棋盘,上面的某些方格中有怪物,现在你能做的一次操作是将其中一行或一列的怪物都消灭掉,问将所有怪物都消灭掉的最少次数是多少? pku 1325题意: A B两台机器分别有n,m(0…n-1, 0…m-1)种工作模式,初始时都处于0模式。而且如果机器要改变模式,必须重启(重启就是回到0模式)。现在有k个任务,每个任务都可以被A或B的某些模式完成。问最少需要重启多少次? 分析:倆道题目我们都可以这样理解:第一个题目: 在棋盘上的每一个怪物,都可选择被该行消灭还是被该列消灭,这是行与列就是一种匹配;而第二个题目:对与每一个任务,有俩种选择,可以选择被A的某种模式或者 阅读全文
posted @ 2011-08-25 14:39 枕边梦 阅读(259) 评论(0) 推荐(0) 编辑
摘要: 题意:R行c列的草地中有些泥坑,FJ想用一些木板将泥坑盖住,但是又不想盖住了草地,已知木板可以任意长。问怎样用最少的木板将所有泥坑盖住?分析:题意是很好理解,可是要想到二分匹配来做就难了,要想到那种构图的方法更是难上加难呀,太佩服了,这种构图方法反正我是怎么想也想不到的。因为不能盖住草地,所以在某一行有可能出现多个横着的木板,所以不能只用一个点来表示一行,而是有多个点。同样列不能只用一个点来表示一列。将连续的点当成一个点建图,一条边仍然表示的是一个有泥地的方格看题目中给的示例:*.*..******...*.转换成下面来个这样的矩阵:1 0 2 00 3 3 34 4 4 00 0 5 0-- 阅读全文
posted @ 2011-08-25 14:30 枕边梦 阅读(275) 评论(0) 推荐(0) 编辑
摘要: 快顶不住了,理解了多少,先写出来再说;题意:军队里面要展开实战演练,已经将n个士兵分成了两队,红队和蓝队。指挥官认为,如果两个属于不同阵营中的士兵是好朋友,那么演练就会有感情因素的干扰。所以要选出最少的人,以排除感情因素的干扰。问要选出多少人?选哪些人? 分析: 就题目而已,很明显是一道求最小覆盖点集的题目,又最小覆盖点数==最大匹配数,所以,单求出队人数的话,就是一道完完全全的求二分最大匹配的题目,可是,要怎么求出最小覆盖点集呢?而且还要按字典序输出?问题就在这里了,在求出最大匹配数的基础,从第一个点开始枚举,若去掉这个点,此时,最小覆盖数减少(即从该点匹配的点为起点,找不到增广路径),则该 阅读全文
posted @ 2011-08-24 01:52 枕边梦 阅读(186) 评论(0) 推荐(0) 编辑
上一页 1 ··· 17 18 19 20 21 22 23 24 25 ··· 34 下一页