原題
這道題目看到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 的強...