字节题--毕业旅行问题

毕业旅行问题_字节跳动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的话,有个比较棘手的问题就是不好记录已经走过的路径。

看了看别人的题解,算了吧,人生总是要放弃一些东西的,莫要强求-_-

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值