摘要: 定义:有向图G=(V,E),G的传递闭包定义为图G*=(V,E*),其中E*={(i,j):图G中存在一条从i到j的通路}方案1:对E中每条边赋以权值1,然后运行Floyd-Warshall算法。如果从顶点i到顶点j存在一条路径,则dij < n,否则dij=INFINITY.方案2:如果图G中从顶点i到顶点j存在一条通路,且其所有中间顶点均属于集合{1,2,...,k},则定义tij(k) 为true,否则为false。我们把边(i,j)加入E*中当且仅当tij(n)= true递归式为tij(0) =false if i!=j and (i,j)不属于E or true if i=j 阅读全文
posted @ 2012-03-13 21:22 Cavia 阅读(4057) 评论(0) 推荐(0) 编辑
摘要: 简单路径p={v1,v2,...,vl}上的中间顶点是除v1和vl以外p上得任何一个顶点。令dij(k)为从顶点i到顶点j、且满足所有中间顶点皆属于{1,2,...,k}的一条最短路径的权值。当k=0时,从i到j根本不存在中间顶点。递归式为dij(k)=wij if k=0 or min(dij(k-1) , dik(k-1) + dkj(k-1)) if k>=1floyd 1 int D[5][25]; 2 3 void Floyd_Warshall(const Graph* g) 4 { 5 for(int i=0;i<25;++i) 6 D[0][i]=g->... 阅读全文
posted @ 2012-03-13 21:05 Cavia 阅读(377) 评论(0) 推荐(0) 编辑
摘要: 设lij(m) 是从顶点i到顶点j的至多包含m条边的任何路径的权值最小值。当m=0时,lij(0) =0 if i=j or INFINITY if i!=j递归定义lij(m) =min 1=<k<=n{lik(m-1) + wkj}实际上从i到j的最短路径至多包含n-1条边,因此lij(n-1)即为所要求的值。注意L(1)=W递归的函数如下View Code 1 EXTEND-SHORTEST-PATH(L,W)2 L'=new Matrix3 for(i=1;i<=n;++i)4 for(j=1;j<=n;++j)5 ... 阅读全文
posted @ 2012-03-13 17:15 Cavia 阅读(337) 评论(0) 推荐(0) 编辑
摘要: 1、Bellman-Ford算法该算法能解决单源最短路径问题,即使存在负权边的情况下。运行Bellman-Ford算法可以返回一个布尔值,如果为true,则说明图中不包含从源点可达的负权回路,算法将产生最短路径及其权值;如果为false,则说明图中包含从源点可达的负权回路,该问题无解。View Code 1 int d[50]; 2 int p[50]; 3 4 //initialize each distance of vertex to source, first source can't be reached 5 //p is the parent of vertex 6 voi 阅读全文
posted @ 2012-03-13 08:58 Cavia 阅读(776) 评论(0) 推荐(0) 编辑