Pursuewind @ 2022-12-26 19:35:52
本人才5年级,只会使用DFS做题,但全T了,是递归有什么问题吗?
#include <bits/stdc++.h>
using namespace std;
struct node
{
int id;
long long w;
};
vector <node> tree[100005];
int n, m, s;
long long pre[100005];
bool flag[100005];
int min_(long long a, long long b)
{
return a < b ? a : b;
}
void dfs(int now, int end_point, long long cost)
{
if (now == end_point)
{
pre[end_point] = min_(pre[end_point], cost);
return ;
}
for (int i = 0; i < tree[now].size(); i ++)
if (!flag[tree[now][i].id])
{
flag[tree[now][i].id] = 1;
dfs(tree[now][i].id, end_point, cost + tree[now][i].w);
flag[tree[now][i].id] = 0;
}
}
void addedge(int u, int v, long long w)
{
tree[u].push_back({v, w});
}
bool cmp(node a, node b)
{
return a.id < b.id;
}
int main()
{
scanf("%d%d%d", &n, &m, &s);
for (int i = 1; i <= n; i ++) pre[i] = 1e9;
for (int i = 1; i <= m; i ++)
{
int u, v;
long long w;
scanf("%d%d%lld", &u, &v, &w);
addedge(u, v, w);
}
for (int i = 1; i <= n; i ++) sort(tree[i].begin(), tree[i].end(), cmp);
for (int i = 1; i <= n; i ++) dfs(s, i, 0);
for (int i = 1; i <= n; i ++) printf("%lld ", pre[i]);
return 0;
}
by zjy2008 @ 2022-12-26 19:42:00
同学,有个东西叫做题解。在右上角方格这个位置。
另外。DFS是没有错误的,但是会TLE。
by AlicX @ 2022-12-26 19:46:00
这样搞时间复杂度不会爆吗?
by Asimplename @ 2022-12-26 19:52:32
@wuyueton dfs时间复杂度当然会爆。建议学一些可以通过本题的最短路算法
by liangbowen @ 2022-12-26 20:11:40
@wuyueton 您好,TLE的意思是时间超限了,这个相信你也知道。
您的时间复杂度大致是指数级别的,当然会超时。
您可以参考题解,学习更加牛逼的算法:Dijkstra 解决这个问题。
by Pursuewind @ 2022-12-26 20:18:10
谢谢各位大佬指教