文章目录
- 1. 题目
- 2. 解题
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。
返回4例2:
输入:[[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阿明),一起加油、一起学习进步!