天池 在线编程 旅行计划(暴力回溯)

文章目录

1. 题目

描述
有n个城市,给出邻接矩阵arr代表任意两个城市的距离。
arr[i][j]代表从城市i到城市j的距离。Alice在周末制定了一个游玩计划,她从所在的0号城市开始,游玩其他的1 ~ n-1个城市,最后回到0号
Alice想知道她能完成游玩计划需要行走的最小距离。返回这个最小距离。除了城市0之外每个城市只能经过一次

n<=10 
arr[i][j]<=10000

示例

1:
输入:[[0,1,2],[1,0,2],[2,1,0]]
输出:4
解释:
[[0,1,2],
 [1,0,2],
 [2,1,0]]
有两种可能的方案。
第一种,城市0->城市1->城市2->城市0,cost=5。
第二种,城市0->城市2->城市1->城市0,cost=4。
返回42:
输入:[[0,10000,2],[5,0,10000],[10000,4,0]]
输出:11

来源:https://tianchi.aliyun.com/oj/141754208384739500/160296091929219253

2. 解题

  • n 比较小,暴力回溯
class Solution {
    int ans = INT_MAX;
public:
    /**
     * @param arr: the distance between any two cities
     * @return: the minimum distance Alice needs to walk to complete the travel plan
     */
    int travelPlan(vector<vector<int>> &arr) {
        // Write your code here.
        int n = arr.size();
        if(n == 0) return 0;
        vector<bool> vis(n, false);
        vis[0] = true;
        dfs(arr, vis, 0, 0, 0);
        return ans;
    }
    void dfs(vector<vector<int>> &arr, vector<bool> &vis, int start, int ct, int dis)
    {
        if(ct == arr.size()-1)//走过的城市够个数了
        {
            if(dis + arr[start][0] < ans)
                ans = arr[start][0] + dis;
            return;
        }
        for(int i = 1; i < arr.size(); i++)
        {	// 1 - n-1 城市
            if(vis[i])//走过了,跳过
                continue;
            vis[i] = true;
            dfs(arr, vis, i, ct+1, dis+arr[start][i]);
            vis[i] = false;
        }
    }
};

754ms C++


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!
Michael阿明

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页