洛谷3953 逛公園(DP)

2022-03-29 08:37:59 字數 1268 閱讀 8617

原題

這道題目看到k特別小,而且k×n的空間不會gg,那麼我們考慮乙個dp對吧。

設\(dp[i][k]\)表示到了點i與最短路相差k值的方案數,然後直接記搜(不想用拓撲序列)就可以了。

// luogu-judger-enable-o2

#include#include#include#include#include#include#include#define ll long long

#define re register

using namespace std;

inline int gi()

while(ch>='0' && ch<='9')

return f*sum;

}inline ll gl()

while(ch>='0' && ch<='9')

return f*sum;

}const int maxn=100010,maxm=200010,maxk=60;

struct nodee[maxm],e1[maxm];

int front[maxn],cnt1,cnt,front1[maxn],flag;

void addr(int u,int v,int w);front1[u]=cnt1;

}void add(int u,int v,int w);front[u]=cnt;

}typedef pairpii;

priority_queue,greater>q;

int dis[maxn],vis[maxn];

void spfa(int s)}}}

int n,m,k,p,time;

int vis[maxn][maxk],dp[maxn][maxk];

int dfs(int u,int k)

if(dp[u][k]>0)return dp[u][k];

vis[u][k]=time;int sum=0;

for(re int i=front[u];i;i=e[i].nxt)

vis[u][k]=time-1;

if(u==n && k==0)return dp[u][k]=1;

return dp[u][k]=sum;

}int main()

spfa(n);int ans=0;

for(re int i=0;i<=k;i++)

printf("%d\n",!flag?ans:-1);

} return 0;

}

洛谷P3953 逛公園

題目 題解 f u k 表示 dis u,n mindis u,n k的方案數,答案就是 f 1 k f u k f v k mindis v,n mindis u,n w 這樣怎麼判 0環呢?只要在搜尋的時候記錄個 instack 就 ok 了 如果當前的 v還在搜尋的棧中就可以直接返回 1了 不...

洛谷P3953 逛公園

發現 k leq 50 猜想時間複雜度肯定與 k 有關。令 dis x 表示 1 到 x 的最短路。考慮 dp。先不考慮無限解得情況,設 f x i 表示到達點 x 走過的路程長度為 dis x i 的方案數。那麼 f x i 肯定由一條邊 y,x 轉移而來。設 y,x 的長度為 d 則這條路徑到 ...

洛谷P3953 NOIp2017 逛公園

考慮到邊權可能為 0 轉移的順序會影響最後的結果,因此我們用記憶化搜尋代替直接dp 0 環 如何判斷乙個點 u是否在滿足條件的路徑上?顯然我們可以知道這個點滿足di s1 u di sn u di s1 n k 我們把所有長度為 0 的邊建成乙個新圖,然後用ta rjan 找出所有點數大於 1 的強...