
描述
有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]]
输出:11class 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++