本人才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;
}