图中点到点最短路径长度

求图中一个点到另一个点的最短路径长度

 1.递归公式

2.代码实现

int large=INT_MAX;
int MostShortPath(int **G,int len,int i,int j)   //邻接矩阵G用来表示图,G[i.i]=0;若Vi不指向Vj,则G[i,j]=INT_MAX;
{
	static int *A=new int[len];           
	for(int k=0;k<len;k++)
		A[k]=0;
	if(i==j)
		return 0;
	if(A[i]>0)
		return A[i];
	int min=large;
	int temp;
	for(int k=0;k<5;k++)
	{
		if( *((int*)G+i*len+k )>0&&*((int *)G+i*len+k)!=large )
		{
			temp=(*((int *)G+i*len+k))+MostShortPath(G,len,k,j);
			if(min>temp)
				min=temp;	
		}
	}
	A[i]=min;
	return A[i];
}

	

3.举例:


int main()
{	int G[5][5]={{0,1,2,large,large},
				{large,0,large,5,large},
				{large,3,0,3,1},
				{large,large,large,0,large},
				{large,large,large,1,0}};
	int n=MostShortPath((int**)G,5,0,3);
	std::cout<<"最短路径长度为:"<<n<<std::endl;
	return 0;
}

结果:




哈密顿回路最短路径问题是一个经典的算法问题,属于最短路径问题的变种。以下是该问题的相关信息: ### 问题定义 哈密顿路径是指从一个起点到一个终点,不重不漏地经过每个点恰好一次的路径。而哈密顿回路最短路径则是在一个带权中,找到一条经过所有顶点恰好一次并回到起点的最短路径。例如,给出一张 $n(n \leq 20)$ 个点的带权无向,需求出起点 0 到终点 $n - 1$ 的最短哈密顿路径 [^4]。 ### 求解方法 #### 动态规划与位运算结合 这是求解该问题的常见方法。使用状态压缩的思想,用一个二进制数表示点的状态,1 代表走过,0 代表没走过。定义 $f [i][j]$ 表示在 $i$ 状态下走到 $j$ 的最小权值,最终答案就是 $f[(1 << n) - 1][n - 1]$。每次更新时将当前的 $f[i][j]$ 值与上一个状态加上到 $j$ 的权值取最小值。动态方程为:$dp[i][j] = min(dp[i][j], dp[i \ xor \ (1 << j)][k] + weight[k][j])$。以下是代码模板示例: ```cpp #include <cstring> #include <iostream> using namespace std; const int INF = 0x3f3f3f3f; const int N = 20; int n; int weight[N][N]; int dp[1 << N][N]; int main() { cin >> n; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { cin >> weight[i][j]; } } memset(dp, INF, sizeof(dp)); dp[1][0] = 0; for (int i = 1; i < 1 << n; i++) { for (int j = 0; j < n; j++) { if (i >> j & 1) { for (int k = 0; k < n; k++) { if ((i ^ (1 << j)) >> k & 1) { dp[i][j] = min(dp[i][j], dp[i ^ (1 << j)][k] + weight[k][j]); } } } } } cout << dp[(1 << n) - 1][n - 1] << endl; return 0; } ``` 上述代码中,首先输入的点数和边的权值,然后初始化 $dp$ 数组,将 $dp[1][0]$ 初始化为 0,表示走了 1 个点时的第 0 个点的最短路为 0。接着通过三重循环进行状态转移,最终输出最短哈密顿路径的长度 [^1][^5]。 #### 记录路径结点序列 在使用动态规划得到最短路径长度后,若需要得到具体的路径结点序列,可以再开一个对应的数组 $pre(s, t, state)$ 表示到达状态 $dp(s, t, state)$ 的最短路径上一次走的是哪一个点,根据这个 $pre$ 数组反向查找,就能得到最短的路径结点序列 [^3]。 ### 复杂度分析 动态规划与位运算结合的方法时间复杂度较高,对于有 $n$ 个点的,状态数为 $2^n$,每个状态需要枚举 $n$ 个点,所以总的时间复杂度约为 $O(n^2 * 2^n)$。 ### 示例表示 对于有向或者无向,假设有 $V$ 个节点,$E$ 条边,$G[V_i, V_j]$ 表示中点 $V_i$ 到 $V_j$ 边的权值。$dist[i]$ 表示点 $s$ 到点 $i$ 的最短路径 [^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值