依图算法笔试第二题,大胃王那一题,回溯超时求指导

用回溯的方法为什么会超时呢?
写个回溯容易嘛
import sys
n,m,start,end = map(int,sys.stdin.readline().strip().split())
start -= 1
end -= 1

cakes = map(int,sys.stdin.readline().strip().split())
matrix = [[0] * n for _ in range(n)]
total = [sys.maxsize - 1]
rs = {}

for _ in range(m):
    nums = map(int,sys.stdin.readline().strip().split())
    matrix[nums[0]-1][nums[1]-1] = nums[2]
#def conflict(i,cur_path):
#    if i in cur_path or matrix[cur_path[-1]][i] == 0:
#        return True
#    return False
def back(cur_path,cur_time,cur_num):
    # print(cur_path,cur_time,cur_num,total,rs)

    if cur_path[-1] == end:
        if cur_time <= total[-1]:
            total.append(cur_time)
            if cur_time not in rs:
                rs[cur_time] = cur_num
            else:
                rs[cur_time] = max(cur_num,rs[cur_time])
            # if cur_num > rs[-1]:
            #     rs.append(cur_num)
        return
    for i in range(cur_path[-1],n):
        if i in cur_path or matrix[cur_path[-1]][i] == 0:
            continue
        else:
            back(cur_path+[i],cur_time+matrix[cur_path[-1]][i],cur_num+cakes[i])

back([start],0,cakes[start])
#tmp = " ".join(map(str,[total[-1],rs[total[-1]]]))
print total[-1],
print rs[total[-1]]
有大佬能知道一下嘛

#依图科技##笔试题目#
全部评论
dijskra, 时间相同时, 优先选蛋糕最多的。 #include <stdio.h> #include <string.h> #include <vector> #include <iostream> #include <queue> using namespace std; const int n = 10000 + 10; const int m = 2000000 + 10; typedef long long ll; ll a[n]; struct edge  { int v; int next; ll time; }e[m]; int head[n]; int cnt = 0; void add(int u, int v, int t) { e[cnt].v = v; e[cnt].time = t; e[cnt].next = head[u]; head[u] = cnt++; } ll times[n]; ll cakes[n]; struct node { int fa; int u; ll time; friend bool operator<(const node &a , const node &b)     {         return a.time>b.time;   // ascending sort     } }; priority_queue<node> q; void dij(int s, int d) { node cur; memset(cakes, 0, sizeof(cakes)); memset(times, -1, sizeof(times)); for(int i = head[s]; i != -1;  i = e[i].next) { node tmp; tmp.fa = s; tmp.u = e[i].v; tmp.time = e[i].time; q.push(tmp); } cakes[s] = a[s]; times[s] = 0; int i = 0; while(!q.empty()) { i+=1; cur = q.top(); q.pop(); //没有走过, 或者有更好的走法 if(times[cur.u] == -1 || cur.time < times[cur.u]) { times[cur.u] = cur.time; cakes[cur.u] = cakes[cur.fa] + a[cur.u]; } // 时间相同,选蛋糕更多的 else if(cur.time == times[cur.u]) { if(cakes[cur.fa] + a[cur.u] > cakes[cur.u]) cakes[cur.u] = cakes[cur.fa] + a[cur.u]; continue; } else { continue; } /* cout << cur.u << " " << cakes[cur.u] << endl; */ for(int i = head[cur.u]; i != -1; i = e[i].next) { if(times[e[i].v] != -1 && cur.time + e[i].time > times[e[i].v]) continue; node tmp; tmp.fa = cur.u; tmp.u = e[i].v; tmp.time = cur.time + e[i].time; q.push(tmp); } } cout << times[d] << " " << cakes[d] << endl; } int main() { int n, m, s, d; cin >> n >> m >> s >> d; s--; d--; for(int i = 0; i < n; ++i) { cin >> a[i]; } int u, v, t; memset(head, -1, sizeof(head)); for(int i = 0; i < m; ++i) { cin >> u >> v >> t; u--; v--; add(u, v, t); add(v, u, t); } dij(s, d); } //6 80
点赞 回复 分享
发布于 2019-08-23 21:05
我用floyd做,但是不知道怎么记录“时间相同,但是蛋糕最多”的路径。。
点赞 回复 分享
发布于 2019-08-23 21:03
原来是超时,我说怎么一直过不了
点赞 回复 分享
发布于 2019-08-23 21:03
那道题不是带权有向图问题嘛,不会写,想蹲一个代码学习下
点赞 回复 分享
发布于 2019-08-23 21:04
用BFS做,过不了,没理解题目😂
点赞 回复 分享
发布于 2019-08-23 21:04
每次都想着回溯就行,每次写回溯写着写着就蒙蔽了😰
点赞 回复 分享
发布于 2019-08-23 21:10
感觉对python不友好,我优化了半天还是60,超时。就是找下个候选点的时候,应该用优先队列是最快的,然后python怎么搞优先队列呢,本来想用heapq的,然后发现忘了...
点赞 回复 分享
发布于 2019-08-23 21:24

相关推荐

评论
点赞
7
分享
牛客网
牛客企业服务