fix(P3953): 修复DFS逻辑错误并添加调试输出

修复DFS函数中节点1的处理逻辑,调整nk的比较运算符,并添加printf调试输出
优化solve函数中dp数组的初始化范围
This commit is contained in:
Zengtudor 2025-11-05 18:37:07 +08:00
parent 5cb2778d2c
commit f67a1ebcb3

View File

@ -7,7 +7,7 @@
#include <vector>
using ll = int64_t;
#define sl static inline
// #define printf
#define printf
const ll maxm=2e5+5,inf=1e9+7;
ll n,m,k,p,nt,d[maxm],dp[maxm][57];
bool isn,vis[maxm][57];
@ -54,21 +54,28 @@ sl ll dfs(ll u,ll k){
isn=true;
return 0;
}
if(u==1)return k==0?1:0;
vis[u][k]=true;
if(dp[u][k]!=-1){
printf("dp[%lld][%lld]=%lld, in temp\n",u,k,dp[u][k]);
return dp[u][k];
}
vis[u][k]=true;
ll nans=0;
for(auto[v,w]:re[u]){
ll nk=d[u]+k-d[v]-w;
if(nk<0||nk>k)continue;
if(nk<0||nk>::k)continue;
nans=(nans+dfs(v, nk))%p;
if(isn){
vis[u][k]=false;
return 0;
}
}
if(u==1){
const ll ret= k==0?1:0;
printf("dp[%lld][%lld]=%lld u==1\n",u,k,ret);
nans=ret;
}
vis[u][k]=false;
printf("dp[%lld][%lld]=%lld\n",u,k,nans);
return dp[u][k]=nans;
}
@ -81,12 +88,11 @@ sl void solve(){
re.clear();
re.resize(n+1);
for(ll i=1;i<=n;i++){
for(ll j=1;j<=50;j++){
for(ll j=0;j<=k;j++){
dp[i][j]=-1;
vis[i][j]=false;
}
}
dp[1][0]=1;
for(ll i=1;i<=m;i++){
ll u,v,w;
std::cin>>u>>v>>w;
@ -99,9 +105,10 @@ sl void solve(){
std::cout<<"0\n";
return;
}
const ll ms=d+k;
// const ll ms=d+k;
ll ans=0;
for(ll i=0;i<=k;i++){
printf("DFS i=%lld----\n",i);
ans=(ans+dfs(n,i))%p;
if(isn){
std::cout<<"-1\n";