• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
mengxm
博客园    首页    新随笔    联系   管理    订阅  订阅
上一页 1 2 3 4 5 6 ··· 8 下一页
2012年2月11日
poj2240
摘要: 与poj1860相似,我建议这两题好好研究,其中透露很多最短路的性质,不要看他人博客写的很简单,就是bellman-ford什么的,然后一想对就坐上去了,那就失去刷题的本意,刷题本意是更深层次的理解一个算法并且灵活应用,看过大多人都是用最长路的方式求解的,但是最长路能用的本质是因为此题可以用最短路来求解,只是多了一个负号,那么去掉负号最短路就变成最长路了,请不要只是停留在知晓有一种最长路求法这样的表面,应该更深入探讨其本质。(纯属个人意见,大牛指点)View Code 1 #include <stdio.h> 2 #include <string.h> 3 #inclu 阅读全文
posted @ 2012-02-11 21:22 mengxm 阅读(231) 评论(0) 推荐(0)
dijkstra,bellman-ford,floyd分析比较
摘要: 其实我一直存在疑惑是什么导致dijkstra不能处理负权图?今日偶见某大牛说一句“dijkstra选定一个节点后节点值不在改变”,方才大悟。本质上就是dijkstra选点方式导致的(即贪心),只针对目前的情况作出最好的判断1)在非负权图中这点是没有错的2)在负权图中就出错了,如0 2 42 0 -34 -3 0为什么呢?证明dijkstra可行的最重要定理:即当i被选中时,dist(i)=min{w(s->i)}定理证明:若不存在一个节点j可以松弛i,那么显然定理成立,否则必存在某一节点j,dist(i)>w(j,i)+dist(j),那么由于在非负权图中所以w(j,i)>0 阅读全文
posted @ 2012-02-11 04:45 mengxm 阅读(1359) 评论(0) 推荐(1)
poj1860
摘要: 经典bellman-ford,目标是求解最长路,(a-c)*r前加负号则转化为求解最短路,更简单的是用求解最短路的方式求解最长路(这举可行是题目原因)#include <stdio.h>#include <string.h>#define MAXN 300#define INF -(1<<29)int n,m,s;double v;struct node{ double r,c;}map[MAXN][MAXN];double d[MAXN];void bellman(){ for(int i=1;i<=n;d[i++]=INF); d[s]=v; fo 阅读全文
posted @ 2012-02-11 02:34 mengxm 阅读(274) 评论(0) 推荐(0)
2012年2月10日
bellman ford算法
摘要: Dijkstra算法是处理单源最短路径的有效算法,但它局限于边的权值非负的情况,若图中出现权值为负的边,Dijkstra算法就会失效,求出的最短路径就可能是错的。这时候,就需要使用其他的算法来求解最短路径,Bellman-Ford算法就是其中最常用的一个。该算法由美国数学家理查德•贝尔曼(Richard Bellman, 动态规划的提出者)和小莱斯特•福特(Lester Ford)发明。Bellman-Ford算法的流程如下:给定图G(V, E)(其中V、E分别为图G的顶点集与边集),源点s,数组Distant[i]记录从源点s到顶点i的路径长度,初始化数组Distant[n]为, Dista 阅读全文
posted @ 2012-02-10 03:09 mengxm 阅读(477) 评论(0) 推荐(0)
2012年2月9日
poj1502
摘要: 水题一道,dijkstra过,就是题意要理解,它只问从第一个人开始,而不是说任选(图中心问题)#include <stdio.h>#include <string.h>#define NUM 101#define INF (1<<29)#define MAX(a,b) ((a)>(b)?(a):(b))int num,map[NUM][NUM],cost[NUM],max;char c[NUM];bool v[NUM];int Read(){ scanf("%s",c); if(c[0]=='x') return I 阅读全文
posted @ 2012-02-09 23:34 mengxm 阅读(356) 评论(0) 推荐(0)
Floyd算法
摘要: Floyd算法的基本思想如下:从任意节点A到任意节点B的最短路径不外乎2种可能,1是直接从A到B,2是从A经过若干个节点X到B。所以,我们假设Dis(AB)为节点A到节点B的最短路径的距离,对于每一个节点X,我们检查Dis(AX) + Dis(XB) < Dis(AB)是否成立,如果成立,证明从A到X再到B的路径比A直接到B的路径短,我们便设置Dis(AB) = Dis(AX) + Dis(XB),这样一来,当我们遍历完所有节点X,Dis(AB)中记录的便是A到B的最短路径的距离。很简单吧,代码看起来可能像下面这样:?for ( int i = 0; i < 节点个数; ++i ) 阅读全文
posted @ 2012-02-09 19:23 mengxm 阅读(180) 评论(0) 推荐(0)
poj1125
摘要: 简单floyd算法应用,适合刚学floyd练手(比如我)#include <stdio.h>#include <string.h>#define INF (1<<20)#define NUM 101#define MIN(a,b) ((a)<(b)?(a):(b))#define MAX(a,b) ((a)>(b)?(a):(b))int num;int map[NUM][NUM];int min,last,minnum;void floyd(){ for(int k=1;k<=num;++k) for(int i=1;i<=num; 阅读全文
posted @ 2012-02-09 19:07 mengxm 阅读(194) 评论(0) 推荐(0)
poj1062
摘要: 本质就是有限制的最短路,将一路上的最大和最小等级记录,每次选取最大最小等级差在允许范围内的点加入即可,用dijkstra可以了,不要忘记最后要加入最后一个购买的物品价值(优惠价为权)#include <stdio.h>#include <string.h>#define len 101#define INF (1<<30)#define ABS(a) ((a)<0?(-a):(a))#define SUB(a,b) (ABS(a-b)<=m?true:false)#define MAX(a,b) ((a)>(b)?(a):(b))#defi 阅读全文
posted @ 2012-02-09 16:23 mengxm 阅读(491) 评论(0) 推荐(1)
2012年2月8日
poj1061
摘要: 卧槽。。。。困了我一年的扩展欧几里得终于做出了,好吧我承认我特别水,关于扩展欧几里得可以看我的博客有介绍这里主要讲一下具体求解过程,a*x+b*y=c, r=gcd(a,b), 如果c可以整除r则x,y有整数解否则没有,然后整个式子除以r得a`*x+b`*y=c`, 此时gcd(a`,b`)=1,然后通过扩展欧几里得求出a`*x+b`*y=gcd(a`,b`)=1的一组解(x`,y`),整个式子乘以c`得a`*(x`*c`)+b`*(y`*c`)=c`,有x=x`*c`+t*b`,y=y`*c`-t*a`,(t位整数),此题要求解最小非负的x,可以利用%运算(a%b)的到最靠近0的数字(符号取 阅读全文
posted @ 2012-02-08 20:32 mengxm 阅读(993) 评论(0) 推荐(0)
Dilworth定理
摘要: Dilworth定理对偶定理:(x,<=)是一个有限偏序集,r为最大链的长度,则x可被分为r个但不能再少的反链证明请看组合数学P95poj3636,:一看就是求最少上升划分数,将上升作为关系,由dilworth定理可知其反链就是不上升,即求最长不上升子序列长度,利用最长下降子序列的二分求法加速(即在二分查找时==情况不返回下标)(不上升) t=(a+b)>>1; if(v[t]<key) b=t; else a=t+1; (下降) if(v[t]==key) return t; else if(v[t]<key) b=t; else a=t+1;观察上述代码。也可 阅读全文
posted @ 2012-02-08 17:01 mengxm 阅读(585) 评论(0) 推荐(0)
上一页 1 2 3 4 5 6 ··· 8 下一页
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3