图论
文章平均质量分 65
AndyZhang
一些当前好走的路会越走越窄,而一些当前艰难的路却会越走越宽广。
展开
-
uva10075
题目大意:给你地球上一些城市,然后给出城市的经纬度,然后给出有直达航线的两个城市(注意啊,这里是单向的,a,b就是a能直达b,b不能直达a,这里wa了一次)。然后给你任意两个城市,求出这两个城市的最短距离。 算法分析:这个就是求最短路径的问题,有几个问题要解决,首先球面距离如何求,这个知识点忘了,自己通过有异面直线的距离,但是有点复杂,后来看看网上的直接一个公式,其实是可以推到出来原创 2011-10-26 23:59:11 · 630 阅读 · 0 评论 -
poj1716-差分约束+spfa
这题目和上题目1201一样,就只改一下权重。注意一点,这题目边比较多,哎,我开搭配100*10005,过了。后来想改为循环队列,没想到原来while(head 其他没什么了。。。总之记住一个原则,求最小值,>=,求最长路。求最大值,代码:#include #define maxN 10005//最大边条数#define inf 0x7fffffff//最大距离stru原创 2012-07-28 09:41:52 · 710 阅读 · 0 评论 -
poj 1201-差分约束+spfa
题意: 在区间[0,50000]上有一些整点,并且满足n个约束条件(u, v, w),即在区间[u, v]上至少有x个整点,问区间[0, 50000]上至少有几个整点。思路:spfa(邻接表)+差分约束。构造差分约束系统的关键:用dict[i]表示区间[0, i]上的整点数,则约束条件可化为dict[v] - dict[u-1] >= w,即dict[v] >= dict[u-1] + w原创 2012-07-28 09:41:39 · 1362 阅读 · 0 评论 -
poj-3159很神奇的一题-差分约束+spfa
这道题目和前面几篇思路一样,不用多说 问题是如果用spfa+队列,肯定tle,换为堆栈就可以了,这题目也就是从头不行,要从尾部开始,就是队列和栈的区别了。 总感觉这题有问题。正向超时,反向484ms。。。。代码:#include #define maxN 30005//最大边条数#define inf 0x7fffffff//最大距离struct Edge {原创 2012-07-28 09:42:01 · 721 阅读 · 0 评论 -
poj1275 差分约束难再建模
题意;Tehran的一家每天24小时营业的超市,需要一批出纳员来满足它的需要。超市经理雇佣你来帮他解决他的问题——超市在每天的不同时段需要不同数目的出纳员(例如:午夜时只需一小批,而下午则需要很多)来为顾客提供优质服务。他希望雇佣最少数目的出纳员。经理已经提供你一天的每一小时需要出纳员的最少数量——R(0), R(1), ..., R(23)。R(0)表示从午夜到上午1:00需要出原创 2012-07-31 21:53:14 · 3408 阅读 · 0 评论 -
poj3281-最大流
题目开始以为可以用二分匹配解决,但是要和两边都求最大匹配,没办法解决。但是想到最大流可以解决二分匹配问题,那么就建图用网络流解决。但是一开始是这样建图源点-food-牛-drink-汇点,这样虽然满足每份food和drink只能给一头牛吃,但是没法解决每头牛只能吃一份的问题。难在建图,如果是这样,源点-food-牛-牛-drink-汇点,将牛拆成两个点,里面的边权值全为1.用效率不是很高的原创 2012-10-29 01:05:02 · 3237 阅读 · 0 评论 -
poj-1236-一起学习强连通分量
题目不是很好理解,简单说一下就是有一个有向图,第一问求至少要复制几次软件,才能保证每个地方都有,实际上就是求入度为0的,也就是走不到的。第二问求至少添加几个扩展,也即是添加几条边,让无论从那个地方,都能让任何地方得到软件。也就是添加几条边,能让整个图强连通。 强连通分量算法1---kosaraju最好理解的两次dfs。步骤概要:1. DFS有向图G,并以后根序记录节点2.原创 2012-10-22 21:23:51 · 1219 阅读 · 0 评论 -
poj-1236--一起学习强连通分量2
上一篇介绍过题目大意和kosaraju算法本篇介绍tarjan算法。引用一下讲解: 概述此算法以一个有向图作为输入,并按照所在的强连通分量给出其顶点集的一个划分。图中的每个结点只在一个强连通分量中出现,即使是在有些结点单独构成一个强连通分量的情况下(比如图中出现了树形结构或孤立结点)。算法的基本思想如下:任选一结点开始进行深度优先搜索(若深度优先搜索结束后仍有未访问的结原创 2012-10-22 21:58:30 · 1237 阅读 · 0 评论 -
poj1144-tarjan求割点
何为割点?也就是题目中的关键点。在一个无向图中,去掉一个点,这个无向图会变成多个子图,那么这个点就叫做割点同理,割边也是如此,如果去掉一条边,能让无向图变成多个子图,那么这条边叫做割边,所谓的桥。 那么tarjan是如何求的割点的呢?如果u为割点,当且仅当满足下面的1/21、如果u为树根,那么u必须有多于1棵子树2、如果u不为树根,那么(u,v)为树枝边,当Low[v]>=原创 2012-10-23 23:40:45 · 6929 阅读 · 8 评论 -
poj3177-tarjan求桥/割边
题目大意:有F个牧场,1给定现有的R条直接连接两个牧场的路,F-1若low[v]>dfn[u],则(u,v)为割边。但是实际处理时我们并不这样判断,因为有的图上可能有重边,这样不好处理。我们记录每条边的标号(一条无向边拆成的两条有向边标号相同),记录每个点的父亲到它的边的标号,如果边(u,v)是v的父亲边,就不能用dfn[u]更新low[v]。这样如果遍历完v的所有子节点后,发现l原创 2012-11-04 13:14:35 · 6805 阅读 · 0 评论 -
poj3352-参考3177,同样代码,直接通过
#include #include #include #define nMax 5005#define Min(a,b) (a<b?a:b)struct EDGE{ int v,next;}edge[2 * nMax];int preEdge[nMax];int N, edgeNum, index;bool map[nMax][nMax];int原创 2012-11-04 13:15:48 · 872 阅读 · 0 评论 -
poj3020-二分图匹配
对于任意图:|最小边覆盖|+|最大匹配|=|V|二分图的最大匹配=最小点覆盖数对于二分图:以下数值等价.最大匹配最小点覆盖|V|-最大独立集(二分图or有向无环图)|V|-最小边覆盖数|V|-最小路径覆盖数(有向无环图)|V|-最小路径覆盖数/2(无向图)(上面括号里有有向无环图的,均是将一个点拆成两个点连边匹配)由于任意图的那几个几乎用不到于是这里原创 2012-10-27 02:13:03 · 1443 阅读 · 0 评论 -
poj2516-经典最小费用最大流-有点难度
题目意思,这个理解起来就很费劲 有N个供给商,M个雇主,K种物品。每个供给商对每种物品的的供给量已知,每个雇主对每种物品的需求量的已知,从不同的供给商输送不同的货物到不同的雇主手上需要不同的花费,又已知从供给商Mj送第kind种货物的单位数量到雇主Ni手上所需的单位花费。问:供给是否满足需求?若是满足,最小运费是多少?样例解释算法分析1、供给是否满足需求原创 2012-11-09 08:44:40 · 1386 阅读 · 0 评论 -
poj3169-所谓的差分约束,但是感觉题目各种问题
题目很好理解,转换为差分约束也好理解。 关键是差分约束是要n+1个点,多一个v0,但是如果按照差分去做,肯定会wa,因为这样做以后,样例肯定都过不了,想想看,v0到其他点距离为0,所以到v1最短为0,v4最短为0,怎么求都得不到最后的27啊????? 还有像vj>=vi(j >= i)这些约束不用加,这个好理解,证明题目中没给这一块的测试用例,数据弱没关系,但是如果你加上了,可能会原创 2012-07-26 08:40:23 · 1017 阅读 · 1 评论 -
poj3169 layout差分约束的证明。。。
在Acm论文中看到的,一起学习一下,至少解决了我不少疑问。3.3 例题3——Layout题意简述:当排队等候喂食时,奶牛喜欢和它们的朋友站得靠近些。FJ有N(2一些奶牛相互间存有好感,它们希望两者之间的距离不超过一个给定的数L。另一方面,一些奶牛相互间非常反感,它们希望两者间的距离不小于一个给定的数D。给出ML条关于两头奶牛间有好感的描述,再给出MD条关于两头奶牛间存有反感原创 2012-07-26 13:10:09 · 3482 阅读 · 2 评论 -
poj1932-bellman、spfa
此题打过游戏的人理解起来不难,就是初始有个血量,然后每到一个房间或者加血或者减血,给出一个初始能量100的人,能否从1走到n,在这个过程中,血量都必须是大于0的。 这题目算法首先要判断能不能从1到达n,用floyd传递闭包然后计算一个最长路,保证每个点血量大于0,否则不能到达,还要求松弛的点能够到达n。。。具体见代码 此题用了两种方法,可以修改if(bellMan())或者原创 2012-07-24 22:11:23 · 899 阅读 · 0 评论 -
poj1847
/* * poj1847.cpp * * Created on: 2010-8-18 * Author: friendy *///就是最短路,题目理解清楚就好做了/* * poj1847.cpp * * Created on: 2010-8-18 * Author: friendy */#includeusing namespace std;in原创 2010-08-18 20:36:00 · 1100 阅读 · 0 评论 -
poj3625
注意要用double型读入否则精度有问题/* * poj3625.cpp * * Created on: 2010-8-18 * Author: friendy *//* * poj3625.cpp * * Created on: 2010-8-18 * Author: friendy */#include#include#include#i原创 2010-08-18 16:37:00 · 1191 阅读 · 1 评论 -
poj 1087 我们一起学习网络流吧
最近一直想搞定这道题目。看了discuss才知道是网络流的题目,好多人说可以用二分图匹配做,这个还没想明白,还是看看经典的网络流吧。以前学习过相关的知识,但是由于学习的时间比较久,加上当时也是学的马马虎虎,所以导致现在对网络流完全不理解。这段时间,抽时间看了一些网上的资料,加上算法导论上的一些解释,也算整明白了。不敢独享,在这里晒晒自己学到的东西,分享。。。网络流基础知识:本程序用的就原创 2012-04-17 00:00:39 · 1467 阅读 · 0 评论 -
poj 1511----spfa
这道题目有点长,看了半天才看懂啥意思。就是有n个车站,m条路线,每条路线有一个价格。要求从起始站到每一站,然后再从每一站回去,求最少的钱数。 看起来就是最短路径的问题,就是求单源点到其他各点的最但距离(票价),然后建个反向图,求的返回的钱数。加起来就行了。 最短路径很多方法,Dijkstra算法,Bell-ford算法,floyd-washall,以及本题目用的spfa算法原创 2012-07-13 20:48:47 · 805 阅读 · 0 评论 -
邻接表-动态和静态的学习
上一篇用到了邻接表,这里学习一下数据结构。 我们知道图的保存方式有很多种,邻接矩阵adjMax【】【】,邻接表。。。。邻接矩阵适合稠密图,而邻接表在表示稀疏图时很节省内存。 而邻接表又有动态和静态之分,静态和动态就不多做解释了,动态就是有多少用多少,静态你要提前分配好够用的内存,一般会比实际用的大一些。。。。 下面是静态表的一个实例#include #inclu原创 2012-07-16 00:19:29 · 1923 阅读 · 2 评论 -
poj3268---spfa
最短路径。。。。由于点比较多1000,,如果dijstra算法 o(n^2)肯定超时,这里用spfa算法。由于1000点,没有用邻接表,内存略大。 算法很简单,还是正向建图,逆向建图,分别求出起点到其他点的最短距离,然后求和,就是从这点出发,然后再回来的的最短距离,最后求出最大值即可。代码:#include#define maxN 1001#define inf原创 2012-07-17 13:52:37 · 683 阅读 · 0 评论 -
poj-1287 不是题目水,而是数据弱
这个题目很简单,就是最简单的最小生成树,并且用克鲁斯卡尔算法很容易。但是,题目中说的边可能是无限的(The number of possible routes is unlimited),如果边有很多,该如何办呢? 当然,这里直接开10000条以上就行了,因为测试用例有限,加入10^10条呢?这里说了最多50个点,那么最多也就1225条边,再多就是重复的,实际上我们只需要开这么大的原创 2012-07-17 13:53:02 · 628 阅读 · 0 评论 -
poj1364-还是建模
根据题意此题是 的关系,但是若是想用差分约束,必须是>= 或者题目给出条件是整数,这就是提示,所以如果>c那么就>=c-1,同理知道了这,直接判有没有负环就行了,不要忘了多加一个源点,保持图的联通性。。。。 代码: #include #define maxN 205//最大顶点数,这里是s[i]#define inf 0x7fffffffstruct Edg原创 2012-08-01 16:25:54 · 797 阅读 · 1 评论 -
poj-1847 之最短路
本题目就是简单的最短路 题目理解起来有点费劲,大概说一下吧!就是有n个交叉点,就当做有n个点就行,然后这些点和其他点有些路径,每个点是一个开关,开关只能有一个方向走一条路,而第一个数就是默认的开关指向,不用旋转。这单犯了个错,就是默认的指向实际上只需要旋转0次,而其他路径只需要旋转1次,无论是哪条,只需1次,当初以为,第二个1次,第3个2次。 题目给的实例3 2 1 /原创 2012-07-19 00:04:25 · 4026 阅读 · 0 评论 -
poj-3013 透过现象看本质,其实都一样
这道题目咋一看就是最小生成树啊。题目描述大概是这样:KCm要准备一颗圣诞树,这棵树有一些节点和边组成。节点从1到n,根总是1.每个节点都有自己的总量,而边的价格是由边的单价乘以子孙节点的重量。求出这么一颗有n个节点的树,使花费最小。 很像最小生成树,仔细研究,没法这样做。因为每条边在找到这颗树之前很难计算它的价值。因为本来你算好的边的价值,但是在去掉某些边时,会导致边的价值原创 2012-07-21 15:07:14 · 1493 阅读 · 1 评论 -
poj-3259 bellman-ford
题意:John的农场里N块地,M条路连接两块地,W个虫洞;路是双向的,虫洞是一条单向路,会在你离开之前把你传送到目的地,就是当你过去的时候时间会倒退Ts。我们的任务是知道会不会在从某块地出发后又回来,看到了离开之前的自己。简化下,就是看图中有没有负权环。解题:bellman_ford和spfa算法均可,但是实现效率bellman_ford更简单,也更容易,虽然spfa算法是be原创 2012-07-22 21:42:24 · 1222 阅读 · 0 评论 -
poj-2387 旧题重温
这道题目原来已经a过了,应该用的是dijstra算法这次用spfa。只需要注意一点,有重边,所以保存邻接矩阵的时候一定要判断一下。#include #define maxN 1002#define inf 1000000000int mat[maxN][maxN];//邻接矩阵bool flag[maxN][maxN];//标示矩阵int dis[maxN]原创 2012-07-22 00:50:45 · 1059 阅读 · 0 评论 -
poj3522-kruscal算法求最小生成树+枚举
题意;给你一个无向,求所有生成树中,最大边与最小边差值最小的那个值。算法分析:排序,从最小边开始,枚举每一条最小边,然后求最小生成树,求差值,然后求出最小值。代码;#include #include #include #define nMax 105#define inf 0x7fffffffstruct EDGE{ int u,v,w;}e原创 2012-11-20 22:47:52 · 1017 阅读 · 0 评论