解题思路:本题可以用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分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复