毕业旅行问题_字节跳动2019春招研发部分编程题汇总_牛客网
例子这么看就很明确了:
绿色的为路线。
注意题目并没有说两个城市之间的往返车费是一样的(虽然给出的例子是一样的),先想到的是dfs遍历,代码如下,思路还是比较简单的,记得最后是要回到起点的,所以需要加上回起点的费用:
#include <iostream>
#include <vector>
using namespace std;
int res = 50000;
//票价数组,访问数组,起点,历经城市数量,票价和
void dfs(vector<vector<int>> &m, vector<int> &visited, int src, int cnt, int sum){
if(sum >= res - m[src][0]) return; //剪枝
if(cnt == m.size()-1){//所有城市都访问了,可以回起点了
res = min(res, sum+m[src][0]);//记得加上回起点的票价
return;
}
for(int i = 1; i < m.size(); ++i){//选择下一站目的地
if(visited[i] == 1) continue;
visited[i] = 1;
dfs(m, visited, i, cnt+1, sum+m[src][i]);
visited[i] = 0;
}
}
int main(){
int n;
cin >> n;
vector<vector<int>> m(n, vector<int>(n, 0));
vector<int> visited(n, 0);
for(int i = 0; i < n; ++i){
for(int j = 0; j < n; ++j){
cin >> m[i][j];
}
}
//起点为0
for(int i = 1; i < n; ++i){//第一站目的地
visited[i] = 1;
dfs(m, visited, i, 1, m[0][i]);
visited[i] = 0;
}
cout << res << endl;
return 0;
}
不幸的是结果超时了,只能过50%。。。
所以就需要更好的剪枝或者使用bfs或者加上记忆化,或者看能不能dp。
但是dp的话,有个比较棘手的问题就是不好记录已经走过的路径。
看了看别人的题解,算了吧,人生总是要放弃一些东西的,莫要强求-_-