解题思路:本题可以用dij算法,但是我感觉dfs更好想,要求最短路径,用递归的话,如果去第2个城市,之前已经去过了,再去一边结果是相同的,所以最优解就是每个城市只去一次,用bool f[N]来判断,然后经行在dfs中加上回溯,即可

注意事项:
设置ans时用0x3f3f3f3f这个最大值容易超时;
参考代码:

#include<bits/stdc++.h>

using namespace std;

#define N  1010

int t[N];//隔离时间;

int w[N][N];

bool f[N];//是否经过;

int n, m;

int ans =10000;//用0x3f3f3f3f容易时间超时;

int nowtime = 0;

void dfs(int step)

{

if (nowtime > ans) return;

if (step == n)

{

ans = min(ans, nowtime);

return;

}

for (int i = 1; i <= n; i++)

{

if (f[i] == false && w[step][i] != 0)

{

nowtime += w[step][i];

f[i] = true;

if (i != n)

{

nowtime += t[i];//加上等待时间;

}

dfs(i);

f[i] = false;

nowtime -= w[step][i];

if (i != n)

{

nowtime -= t[i];

}

}


}

}

int main()

{

cin >> n >> m;

for (int i = 1; i <= n; i++)

{

cin >> t[i];

}

for (int i = 0; i < m; i++)

{

int u, v, time;

cin>>u>>v>>time;

w[u][v] = time;

w[v][u] = time;

}

f[1] = true;

dfs(1);

cout << ans;

}


点赞(0)
 

0.0分

2 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 1 条评论

dotcpp0755483 8月前 回复TA
10000这个万一大于他的最优解,你这个就完了,不行