随笔分类 -  最短路径

摘要://题目类型;最短路--求次短路的长度 //基本方法从起点s出发求一次最短路,用 d[] 记录最短路径长度,从终点 t 对反向图求一次最短路径,rd[]记录最短距离,//然后枚举每一条边 <u,v>,取 d[u]+ w(u,v)+ rd[v] 最小而又大于最短路径的就是次短路径。#include <iostream>#include <queue>//#incl... 阅读全文
posted @ 2010-06-09 18:50 北海小龙 阅读(503) 评论(0) 推荐(0)
摘要://题目大意:求两点之间最短路的条数,但是前提是已走过的路径不能重复//题目类型:最大流+最短路径//解题思路:首先用Dijkstra求出两点之间的最短路,然后判断每条边是否在最短路上,如果在最短路上,则流量自增1 ,然后求出最大流 #include <iostream>#include <algorithm>#include <queue>#include &... 阅读全文
posted @ 2010-06-07 21:30 北海小龙 阅读(597) 评论(0) 推荐(0)
摘要://题目类型:分数规划//算法实现:SPFA+二分法 题意:求存在一个环路,所有的点权之和/所以的边权之和 最大是多少?算法:此题是对01分数规划的应用,那么首先明白01分数规划的思想.01分数规划的思想的描述如下:令c=(c1,c2,…,cn)和d=(d1,d2,…,dn)为n维整数向量,那么一个0-1分数规划问题用公式描述如下:FP: 最小化(c1x1+&helli... 阅读全文
posted @ 2010-06-06 11:19 北海小龙 阅读(917) 评论(0) 推荐(0)
摘要:#include <vector>using namespace std;typedef struct edge{ int v; int w;}edge;#define narray 1001const int maxData = 0x7fffffff; vector<edge> adj[narray]; //邻接表 int m,n; //m为边数,n为顶点数 int d[... 阅读全文
posted @ 2010-06-05 22:15 北海小龙 阅读(1365) 评论(0) 推荐(1)
摘要://题目类型;最短路-—最短路和相差一个单位的次短路的条数和//本题关键在于理解Dijkstra的贪心思想解题思路:本题若开始直接在Dijkstra中加入针对加1的递推式, 必须在Dijkstra的过程中加入DFS, 很繁琐. 改换求次短路, 然后判断次短路是否比最短路长1. 解法一、A*求第K短路,把前面K条路都求出来,pku 2449 ,但是据说这个题的最后答案超过10^8,把路全... 阅读全文
posted @ 2010-06-05 21:51 北海小龙 阅读(1378) 评论(0) 推荐(0)
摘要://题目类型;最短路-求最短路的条数//解题思路:类似于贪心的思路,基本方法为采用递推,用 p[] 记录路径条数,//(1)dist[u]+ w(u,v)== dist[v] ,则 p[v]+= p[u]//(2)dist[u]+ w(u,v)< dist[v] 则 p[v]= p[u]。//由于本题边数较多,所以采用邻接表的结构存储 #include <iostream>#in... 阅读全文
posted @ 2010-06-05 19:31 北海小龙 阅读(292) 评论(0) 推荐(0)
摘要://题目类型:求K最短路//算法实现:Dijkstra+A*(启发式搜索)//首先求出其他点到des的最短距离,然后用基于BFS的优先队列A*算法求,f(i)=g(i)+h(i) 其中h(i)表示i到des的最短路,g(i)表示从src到i的//路径长度每次取出f(i)值最小的,当第k次取出t时即求出第k短路#include <iostream>#include <queue&g... 阅读全文
posted @ 2010-06-05 14:52 北海小龙 阅读(1162) 评论(0) 推荐(0)
摘要:#include <iostream>#include <algorithm>#include <queue>#include <climits> //引入<climits>的类,注意如果引入<limits>会出现编译错误 #include <cstdio>//#include <conio.h>usi... 阅读全文
posted @ 2010-06-04 18:47 北海小龙 阅读(814) 评论(0) 推荐(0)
摘要://算法实现:Dijkstra+邻接表+优先级队列//解题思路:由于是构造一棵树,则最终所求答案ans = ∑dist[i] * weight[i].(1 <= i <= vn),其中dist[i]为结点i到根结点root(1)的距离,vn为结点数,//而且weight[i]是固定的,ans仅仅与dist[i]有关。这样就转换成了求各点到根结点的最短路径。#include &l... 阅读全文
posted @ 2010-06-04 18:38 北海小龙 阅读(679) 评论(0) 推荐(0)
摘要:int maxData=10000000;int graph[arraysize][arraysize];int d[arraysize];int pre[arraysize]; //存储节点前驱 bool final[arraysize];int t,n;void Dij(int src){ int i,j; int minData; int v; memset(final,0,sizeof(f... 阅读全文
posted @ 2010-06-03 20:56 北海小龙 阅读(275) 评论(0) 推荐(0)
摘要:void SPFA(int src){ queue<int> myqueue; int i,j; memset(final,0,sizeof(final)); memset(pre,-1,sizeof(pre)); myqueue.push(src); for(i=0;i<=ncount;++i) //SPFA算法与Dij不同,SPFA初始化时将除源点以外所有点的最短距离初始化无... 阅读全文
posted @ 2010-05-30 22:14 北海小龙 阅读(394) 评论(0) 推荐(0)
摘要:算法简介 SPFA(Shortest Path Faster Algorithm)是Bellman-Ford算法的一种队列实现,减少了不必要的冗余计算。 它可以在O(kE)的时间复杂度内求出源点到其他所有点的最短路径,可以处理负边。算法流程 SPFA对Bellman-Ford算法优化的关键之处在于意识到:只有那些在前一遍松弛中改变了距离估计值的点,才可能引起他们的邻接点的距离估计值的改变。因此,算... 阅读全文
posted @ 2010-05-25 21:20 北海小龙 阅读(1072) 评论(0) 推荐(0)
摘要://题目类型:SPFA(邻接表实现) //变量名字一定注意不要重复,因为此wa了n次。 #include <vector>#include <queue>//#include <conio.h>#include <iostream>using namespace std;#define arraysize 501int n,m,wnum;int ma... 阅读全文
posted @ 2010-05-25 21:10 北海小龙 阅读(232) 评论(0) 推荐(0)
摘要:Bellman-Ford算法流程分为三个阶段:(1) 初始化:将除源点外的所有顶点的最短距离估计值 d[v] ←+∞, d[s] ←0;(2) 迭代求解:反复对边集E中的每条边进行松弛操作,使得顶点集V中的每个顶点v的最短距离估计值逐步逼近其最短距离;(运行|v|-1次)(3) 检验负权回路:判断边集E中的每一条边的两个端点是否收敛。如果存在未收敛的顶点,则算法返回... 阅读全文
posted @ 2010-05-24 22:45 北海小龙 阅读(351) 评论(0) 推荐(0)
摘要://题目类型:典型的差分约束(Bellman-Ford算法实现) 差分约束的讲解见《算法导论》 假设X[i]表示横坐标,对于 a b d 需要满足:1)如果是喜欢关系,X[b] - X[a] <= d,于是加一条 a 到 b 权为 d的边;2) 如果是讨厌关系,X[b] - X[a] >= d,即X[a]-X[b]<=-d,于是加一条 b 到 a 权为 -d的边;有负环输出 -1... 阅读全文
posted @ 2010-05-24 22:36 北海小龙 阅读(417) 评论(0) 推荐(0)
摘要://题目类型:最短路类型//算法实现:Dijkstra(邻接表+优先级队列) ,使用此算法效率非常高,只有2094MS #include <stdio.h>#include <iostream>//#include <conio.h>#include <queue>using namespace std;#define arraysize 10000... 阅读全文
posted @ 2010-04-28 22:42 北海小龙 阅读(342) 评论(0) 推荐(0)
摘要:/*Dij的变形,这道题目的意思大致是,给你起点和终点,还有一些可用来中间过度的点,首先保证你能够跳跃到终点,同时还要保证你的跳跃跨度最小,也就是从起点到终点路径上的最大的那条边要尽量小,这个有点绕,所以我把这道题目改一下等价题:假设你在玩一个闯关游戏,目的是到达终点闯关,走哪条路无关紧要,你把那些点之间的路径看成是怪物,路径长度看成是怪物的能量值,如果你想击败怪物顺利闯关的话,你的能量值必须高于... 阅读全文
posted @ 2010-04-25 20:29 北海小龙 阅读(464) 评论(0) 推荐(0)