解题思路:本题可以用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语言程序设计教程(第三版)课后习题6.10 (C语言代码)浏览:827 |
WU-蓝桥杯算法提高VIP-勾股数 (C++代码)浏览:1685 |
C语言程序设计教程(第三版)课后习题10.2 (C语言代码)浏览:564 |
WU-C语言程序设计教程(第三版)课后习题12.1 (C++代码)浏览:1024 |
Hello, world! (C语言代码)浏览:766 |
出圈】指针malloc版浏览:377 |
勾股数 (C语言代码)浏览:830 |
单词个数统计 (C语言代码)浏览:1046 |
淘淘的名单 (C语言代码)浏览:1309 |
C语言程序设计教程(第三版)课后习题8.4 (C语言代码)浏览:670 |