为什么dfs会T那么多?

P1462 通往奥格瑞玛的道路

wh_up @ 2024-05-26 20:24:17

#include<cstdio>
#include<vector>
#define N 10005
#define INF 2e+9

using namespace std;

struct node{
    int to,w;
};

vector<node> v[N];
int f[N],tag[N], n,m,b, ans=INF;

void dfs(int u, int s, int now){
    // u为当前节点,s为剩余血量,now为当前路径上交过的最大费用

    // 记录到这个结点需要付的费用
    now = f[u]>now?f[u]:now; 

    if(u == n){
        ans = now < ans ? now : ans; // 取小的
        return ; 
    } 

    // 枚举从u出发的所有边到其他节点 
    int i;
    node tmp; 
    for(i=0;i<v[u].size();i++){
        tmp = v[u][i];
        if(s-tmp.w >= 0 && !tag[tmp.to]){ // 能够经过这条边,并且对应节点没有被访问过 
            tag[tmp.to]=1; // 标记! 
            dfs(tmp.to,s-tmp.w,now);
            tag[tmp.to]=0; // 回溯后取消标记 
        }
    }
}

int main(void)
{
    int i,j,x,y,z;
    scanf("%d %d %d", &n,&m,&b);
    for(i=1;i<=n;i++)   scanf("%d", f+i);
    for(i=1;i<=m;i++){
        scanf("%d %d %d", &x,&y,&z);
        v[x].push_back(node{y,z});
        v[y].push_back(node{x,z});
    }

    tag[1]=1;
    dfs(1,b,0);
    if(ans != INF)  printf("%d",ans);
    else    printf("AFK");
    return 0;
}

by AfterFullStop @ 2024-05-26 20:28:14

因为你的解法是错的啊。

其实你可以看看题解的。


by do_it_tomorrow @ 2024-05-26 20:29:10

@wh_up 您这比 spfa 还要劣一点,凭什么过?


by Roronoa__Zoro @ 2024-06-23 13:50:36

你用dfs跑最短路?


by Roronoa__Zoro @ 2024-06-23 13:52:26

您可以用Dij+二分跑 or spfa+二分跑,题解里都有


|