随笔分类 -  图论

摘要:要求将点集顺时针连接,且线不交叉,输出最多能连的点数,并输出路径。由于最近一直在看凸包问题,所以读完题,首先想到Graham法,不过Graham法用得比较麻烦。后来上网看了下解题报告,原来卷包裹法才是正解,于是用卷包裹法又解了一遍。这里把这两种方法都写一写吧。Graham法:递归求每层凸包,每层凸包的最后一点A,要去找下一层凸包与A向左转最小角的点做为下一点B,(因为题目要求逆时针,并不交叉)即下一个凸包起点。想想其实和卷包裹法思想差不多;卷包裹法:以最左下方的点为起点A,找其余与A向左转最小角的点做为下一点B,然后用同样的方法再去找B的下一个点,直到找完所有点。是不是要比上面的Graham法 阅读全文
posted @ 2011-02-25 21:47 CoderZhuang 阅读(228) 评论(0) 推荐(0)
摘要:http://poj.org/problem?id=1113题意:给定n个点,建一个围墙,围住所有点,并且墙与所有点的距离不得小于L,求这个墙最小的长度。解题:凸包边长+L半径圆周长copy一个证明:http://blog.sina.com.cn/s/blog_687916bf0100jq9g.html证明如下:假如顺时针给出四个点A、B、C、D。组成了凸四边形ABCD。我们不妨过A点作AE垂直于AB,同时过A点再作AF垂直于AD,过B点作BG、BH分别垂直于AB、BC。连结EG,垂线段的长度为L,过A点以AE为半径作一段弧连到AF,同理,使GH成为一段弧。此时EG=AB(边),AB段城墙的最 阅读全文
posted @ 2011-02-24 20:02 CoderZhuang 阅读(491) 评论(0) 推荐(0)
摘要:http://poj.org/problem?id=2187题意:给定平面的一些点,求最远两点距离的平方值。解题:用Graham法求凸包,注意凸包边上如果存在点要保留,因为存在所有的点组成的是一条直线的情况。再用枚举法求凸包的直径,当然凸包直径也可用旋转卡壳求解,可惜这种方法我还不是很清楚。#include<stdio.h>#include<stdlib.h>#include <iostream>#include <cmath>#include <algorithm>using namespace std;#define maxn 5 阅读全文
posted @ 2011-02-23 15:21 CoderZhuang 阅读(275) 评论(0) 推荐(0)
摘要:http://hi.baidu.com/acmer%CE%CF%C5%A3/blog/item/63cc29a3670f77a1caefd0e1.html凸包点集Q的凸包(convex hull)是指一个最小凸多边形,满足Q中的点或者在多边形边上或者在其内。右图中由红色线段表示的多边形就是点集Q={p0,p1,...p12}的凸包。顶点个数n(1)排序:在点集Q中找最左下方的点p0,就是x坐标和y坐标都最小的点,其余的点计算它们的极坐标幅角,以幅角的非降序顺序来排序,如果有幅角相同的,最接近p0的优先。(这是《ACM程序设计培训教程》上的排序方法,由于看不懂什么是幅角,于是上网找了另一种排序方 阅读全文
posted @ 2011-02-20 23:34 CoderZhuang 阅读(310) 评论(0) 推荐(0)
摘要:题目讲的是主人出去遛狗。图中有n个景点和m个好玩的地方,主人要沿直线走完n个景点,主人和狗的起点、终点一样,途中狗会离开主人去去一个好玩的地方(每次最多只能一个)并在下一个景点与主人会合,狗的速度是主人的两倍。问最多狗能去几个地方(景点数+能去的最多好玩地方),并且输出狗的行走路线;构图:把主人走的路段作为X部,景点作为Y部。如果狗在某个路段能到达某个景点就将这两个连线。套用模板求得最大匹配即为狗能到达的最多好玩地方,再加上景点数即可;Source CodeProblem: 1034User: 541780774Memory: 416KTime: 63MSLanguage: G++Result 阅读全文
posted @ 2011-02-12 23:32 CoderZhuang 阅读(275) 评论(0) 推荐(0)
摘要:http://poj.org/problem?id=2594太经典了,最小路径覆盖之变形!如果题目中有暗示此图无环且路径是单向的话,必然是最小路径覆盖无疑!这个题的题目意思和那个伞兵题差不多,但是伞兵走过的路径是可以交叉的,这样我们先做一个传递闭包,然后再连边做最小路径覆盖即可。Source CodeProblem: 2594User: 541780774Memory: 652KTime: 1110MSLanguage: G++Result: AcceptedSource Code#include<stdio.h> #include<stdlib.h> #include 阅读全文
posted @ 2011-02-12 15:52 CoderZhuang 阅读(145) 评论(0) 推荐(0)
摘要:最短带权路径问题的解法::Dijkstra & Floyd 在一个网络中,如果两个结点之间有直接的因果关系,则这两个结点直接连通,在连接两个结点的弧上标上它的代价或权,值得注意的是这样的代价不一定是对称的,即A到B的代价不一定等于B到A的代价,实际问题中以行船为例,有顺水和逆水的区别。在图G中,给出两个结点求这样一条最短的路径,使经过这条路径上的代价之和最小,这就是最短路径问题。 如果所有弧上的权都相等,则问题退化为求两个结点间的一条路径使经过的中间结点最少。比如在一个城市的交通网络中,乘客关心的可能只是旅途中中转的次数,只希望转更少次数的车。对于这样的问题,运用BFS对图进行层次遍历 阅读全文
posted @ 2011-02-10 23:16 CoderZhuang 阅读(746) 评论(0) 推荐(0)
摘要:http://poj.org/problem?id=1325两台机器A,B,A有n个模式,B有m个模式,现在有k个工作,其中每一个工作可以由A或B中的一个特定模式来完成,但是切换机器的模式要重新启动一次,问最少要重启多少次机器才能完成所有工作?A,B两台机器构成一个二分图,在之间按照给出的条件连边。这样想,每一个工作其实是由一条边来代表的,那么我们只要用最少的顶点来覆盖所有的边即可。这就是最小覆盖。根据公式:最小覆盖=最大匹配;对原二分图做一次最大匹配即可。对了,针对这个题还有一个问题,就是起始状态下是在mode 0的,如果在这个模式下工作,是不需要切换mode的,所以只要有工作是在mode 阅读全文
posted @ 2011-02-10 23:06 CoderZhuang 阅读(195) 评论(0) 推荐(0)
摘要:http://poj.org/problem?id=2771老师带学生出去旅游,但是担心学生会发生恋爱关系,所以带出去的学生至少要满足以下要求之中的一个:1.身高相差40cm以上2.同性3.喜欢的音乐风格不同4.喜欢的运动相同问最多可以带出去多少学生?个人感觉如果有男有女,就很有可能是二分匹配了。这道题我们反过来想,如果将所有可能发生恋爱关系的男女配对,那么可以带出去的人数应该等于这个二分图的最大独立集。根据公式: 最大独立集=顶点数(包括X和Y)-最大匹配求一次匹配即可。Source CodeProblem: 2771User: 541780774Memory: 1088KTime: 579 阅读全文
posted @ 2011-02-10 21:28 CoderZhuang 阅读(204) 评论(0) 推荐(0)
摘要:http://poj.org/problem?id=3216题目说的是一个城市里面有Q个点,有M项工作,每个工作有个工作地点pi,最晚开始时间ti,和工作需要的时间di.从城市中的任意一个点到另一个点的直接时间又一个矩阵给出。不连通为-1.注意间接联通是被允许的。我再这个题上哉了2次,汗啊。我总是以为二分图的顶点时基于城市中的点的,但实际上时基于工作。这一题首先对给定的图做一次floyd,这样就能求出两个点之间最少需要走的时间。然后判断两个工作之间是否存在先后关系最后做最小路径覆盖即可。注意这里的顶点数应该是工作数!这一题值得重点注意!!!Source CodeProblem: 3216Use 阅读全文
posted @ 2011-02-10 18:07 CoderZhuang 阅读(220) 评论(0) 推荐(0)
摘要:http://poj.org/problem?id=1125题意:有n个股票经纪人,要求从中选择一个作为散发谣言的开端,使得最后一个人收到谣言时时间时最短,当然谣言只能在有关联的两人这间传播。要注意从A到B和从B到A的时间并不等价!!解题:典型的最短路问题,套用Floyd算法即可。Source CodeProblem: 1125User: 541780774Memory: 408KTime: 0MSLanguage: G++Result: AcceptedSource Code#include<stdio.h> #include<stdlib.h> #include&l 阅读全文
posted @ 2011-02-10 17:57 CoderZhuang 阅读(145) 评论(0) 推荐(0)
摘要:http://poj.org/problem?id=1422典型的最小路径覆盖题,城市之间单向相连,无环!问最少用多少个伞兵能遍历这张图。根据定理:最小路径覆盖=顶点数-最大匹配数Source Code #include<stdio.h>#include<stdlib.h>#include<string.h> int nx, ny; // X的點數目、Y的點數目 int mx[121], my[121]; // X各點的配對對象、Y各點的配對對象 bool vy[121]; // 紀錄Graph Traversal拜訪過的點 bool adj[121][12 阅读全文
posted @ 2011-02-09 22:48 CoderZhuang 阅读(159) 评论(0) 推荐(0)
摘要:http://poj.org/problem?id=2226这个题的原型应该是Asteroids的变种,刚看了这道题,一眼就看出了是最小覆盖,看来我理解了最小覆盖的内在含义了。农夫John的养牛场,是一个R行C 列的矩形,一场大雨后,养牛场低洼的地方都有了积水。John 的牛都很娇贵的,他们吃草的时候,不想把他们的蹄子给弄脏了。为了不让牛儿们把它们的蹄子弄脏,John 决定把有水的地方铺上木板。他的木板是宽度为1,长度没有限制的。 他想用最少数目的木板把所有有水的低洼处给覆盖上,前提是木板不能覆盖草地,但是可以重叠。Sample:4 4*.*..******...*.把行里面连在一起的坑连起来 阅读全文
posted @ 2011-02-09 18:17 CoderZhuang 阅读(175) 评论(0) 推荐(0)
摘要:http://poj.org/problem?id=1469学生选课问题,基础匹配问题。有p节课,n个学生,每节课可以由指定的几个学生参加,但是每个学生只能参加一节课。现在问能不能找到一些学生使得他们:1.每个学生匹配不同的一节课2.每节课匹配一个学生。就是求个最大匹配,看看匹配数是不是等于课程数。如果相等不就满足要求了么.Source Code #include<stdio.h> #include<stdlib.h> #include<string.h> int nx, ny; // X的點數目、Y的點數目 int mx[302], my[1... 阅读全文
posted @ 2011-02-09 14:44 CoderZhuang 阅读(140) 评论(0) 推荐(0)
摘要:题目的意思大致就是,一个矩形中,有N个城市,现在这n个城市都要覆盖无线,若放置一个基站,那么它至多可以覆盖相邻的两个城市。问至少放置多少个基站才能使得所有的城市都覆盖无线?构图:行扫描所有城市,编号,如果有城市相邻就连一条边,当然如果3和4相邻,首先graph[3][4]=1,当扫描到4时graph[4][3]也连一条边,最后只需要取一半即可.求最大匹配的一半,这样可以得到所有2个相邻城市被一个基站覆盖所需要的基站数。然后再加上独立的那些基站即可。公式是:N-最大匹配(代表所有可以和相邻城市配对的城市数)+最大匹配/2=N-最大匹配/2; Source Code #include<std 阅读全文
posted @ 2011-02-09 09:02 CoderZhuang 阅读(169) 评论(0) 推荐(0)
摘要:http://poj.org/problem?id=3041在N*N的平面上有K颗小行星,现在你要摧毁他们,你的每一发子弹可以摧毁同一行,或者是同一列上的小行星,现在问你最少要多少子弹才能摧毁所有的小行星?构图:如果在i行j列上有一颗小行星 则graph[i][j]=1,再求最大匹配即可。这一题用到的结论是 :最小顶点覆盖 = 最大匹配(最小覆盖要求用最少的点(X集合或Y集合的都行)让每条边都至少和其中一个点关联) #include<stdio.h>#include<stdlib.h>#include<string.h> int nx, ny; // X的點 阅读全文
posted @ 2011-02-09 00:01 CoderZhuang 阅读(133) 评论(0) 推荐(0)