aiai


私信TA

用户名:dotcpp0710045

访问量:127

签 名:

等  级
排  名 46636
经  验 315
参赛次数 0
文章发表 1
年  龄 0
在职情况 学生
学  校 聊城大学
专  业

  自我简介:

TA的其他文章

DFS,最优解
浏览:114

解题思路:本题可以用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 人评分

  评论区

10000这个万一大于他的最优解,你这个就完了,不行
2024-05-18 17:34:19
  • «
  • 1
  • »