求助,全T了

P4779 【模板】单源最短路径(标准版)

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

谢谢各位大佬指教


|