K站中转内最便宜的航班

题目链接:https://leetcode-cn.com/problems/cheapest-flights-within-k-stops
题目描述:
有 n 个城市通过一些航班连接。给你一个数组 flights ,其中 flights[i] = [fromi, toi, pricei] ,表示该航班都从城市 fromi 开始,以价格 pricei 抵达 toi。
现在给定所有的城市和航班,以及出发城市 src 和目的地 dst,你的任务是找到出一条最多经过 k 站中转的路线,使得从 src 到 dst 的 价格最便宜 ,并返回该价格。 如果不存在这样的路线,则输出 -1。

题解:

题解链接LeetCode K站中转内最便宜的航班(回溯法、动态规划)
回溯法:

class Solution {
public:
    int minCost = INT_MAX;
    int findCheapestPrice(int n, vector<vector<int>>& flights, int src, int dst, int k) {
        vector<vector<int>> graph(n, vector<int>(n, -1));
        for(auto &flight : flights)    //构建图信息
            graph[flight[0]][flight[1]] = flight[2];
        vector<bool> visited(n, false);     //标记数组
        visited[src] = true;
        trackingBack(graph, visited, n, dst, k, 0, src, 0);
        return minCost == INT_MAX ? -1 : minCost;
        
    }

    void trackingBack(vector<vector<int>> &graph, vector<bool> visited, int n, int dst, int k, int haveCost, int nowSrc, int myK)
    {
        if(nowSrc == dst)  //得到一种方案
        {
            minCost = min(minCost, haveCost);
            return;
        }
            
        //剪枝:中转个数超过了k,花费超过了当前已找到的最小花费
        if(myK > k || haveCost >= minCost)
            return;
        //遍历节点
        for(int i = 0; i < n; i++)
        {
            if(!visited[i] && graph[nowSrc][i] != -1)
            {
                visited[i] = true;
                trackingBack(graph, visited, n, dst, k, haveCost + graph[nowSrc][i], i, myK + 1);
                visited[i] = false;
            }
        }

    }
    
};

原文地址:https://www.cnblogs.com/ZigHello/p/15195393.html