打印最优路径

还是DP问题

const int N = 5;

struct COORDINATE
{
        int i;
        int j;

        COORDINATE(int x, int y) : i(x), j(y) {}
};

void PrintPath(int A[N][N])
{
        int DP[N][N];
        DP[0][0] = A[0][0];
        for (int i = 1; i < N; i++)
        {
                DP[0][i] = DP[0][i-1] + A[0][i];
        }

        for (int i = 1; i < N; i++)
        {
                for (int j = 0; j < N; j++)
                {
                        if (0 == j)
                                DP[i][j] = DP[i-1][j] + A[i][j];
                        else
                                DP[i][j] = A[i][j] + max(DP[i][j-1], DP[i-1][j]);
                }
        }

        stack<COORDINATE> stk;
        int x = N-1;
        int y = N-1;
        while(x != 0 || y != 0)
        {
                stk.push(COORDINATE(x, y));
                if (0 == x)
                        y--;
                else if (0 == y)
                        x--;
                else
                {
                        if (DP[x][y] == A[x][y] + DP[x-1][y])
                                x--;
                        else
                                y--;
                }
        }

        stk.push(COORDINATE(0, 0));

        while (!stk.empty())
        {
                cout<<"("<<stk.top().i<<","<<stk.top().j<<")"<<endl;
                stk.pop();
        }
}


最优路径通常需要使用图论中的最短路径算法,其中最常见的算法是Dijkstra算法和A*算法。下面是使用Dijkstra算法求最短路径的C语言代码示例: ```c // 定义最大顶点数和无穷大常量 #define MAX_VERTICES 100 #define INF 1000000 // 定义邻接矩阵 int adj[MAX_VERTICES][MAX_VERTICES]; // Dijkstra算法求最短路径 void dijkstra(int start, int n, int *distance, int *prev) { bool visited[MAX_VERTICES] = {false}; // 标记顶点是否已访问 distance[start] = 0; // 起点到起点距离为0 for (int i = 0; i < n; i++) { int u = -1; int min_distance = INF; for (int j = 0; j < n; j++) { if (!visited[j] && distance[j] < min_distance) { u = j; min_distance = distance[j]; } } if (u == -1) return; // 所有顶点都已访问完,退出循环 visited[u] = true; for (int v = 0; v < n; v++) { if (!visited[v] && adj[u][v] != INF) { int new_distance = distance[u] + adj[u][v]; if (new_distance < distance[v]) { distance[v] = new_distance; prev[v] = u; } } } } } // 递归打印路径 void print_path(int *prev, int start, int end) { if (start == end) { printf("%d", start); return; } print_path(prev, start, prev[end]); printf(" -> %d", end); } // 测试代码 int main() { int n = 6; // 顶点数 int start = 0; // 起点 int end = 5; // 终点 int distance[MAX_VERTICES] = {INF}; // 起点到各个顶点的距离 int prev[MAX_VERTICES] = {-1}; // 最短路径的前一个顶点 dijkstra(start, n, distance, prev); printf("最短路径长度为:%d\n", distance[end]); printf("最短路径为:"); print_path(prev, start, end); printf("\n"); return 0; } ``` 在上面的代码中,我们首先定义了一个邻接矩阵来表示图,其中`adj[i][j]`表示顶点`i`和顶点`j`之间的距离,如果没有边相连,则距离为无穷大。然后使用Dijkstra算法求出起点到各个顶点的最短距离和最短路径的前一个顶点,并使用递归打印最短路径。最后在测试代码中,我们定义了一个6个顶点的图,并假设起点为0,终点为5,来测试我们的算法。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值