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