feat: 添加P3953.cpp实现最短路径计数功能

实现了一个基于Dijkstra算法的最短路径计数解决方案,用于计算在给定约束条件下从起点到终点的路径数量。包含输入处理、最短路径计算和路径计数逻辑。当路径步数超过阈值时返回-1,否则返回路径数模p的结果。
This commit is contained in:
Zengtudor 2025-11-05 14:18:47 +08:00
parent 8aeb58ec32
commit a788926d44

93
src/11/5/P3953.cpp Normal file
View File

@ -0,0 +1,93 @@
#include <bitset>
#include <cstdio>
#include <deque>
#include <iostream>
#include <istream>
#include <queue>
#include <vector>
using ll = int64_t;
#define sl static inline
// #define printf
const ll maxm=2e5+5;
ll n,m,k,p,nt;
struct E{
ll v,w;
};
struct P{
ll now,step;
inline bool operator<(const P&o)const{
return step>o.step;
}
};
std::vector<std::vector<E>> edg;
std::bitset<maxm> vis;
std::deque<P>dq;
sl ll dj(){
vis.reset();
std::priority_queue<P> pq;
pq.emplace(1,0);
while(pq.size()){
auto[now,step]=pq.top();
pq.pop();
if(now==n)return step;
if(vis[now])continue;
vis[now]=true;
for(auto[v,w]:edg[now]){
pq.emplace(v,step+w);
}
}
return -1;
}
sl void solve(){
printf("NT = %lld\n",++nt);
std::cin>>n>>m>>k>>p;
edg.clear();
edg.resize(n+1);
for(ll i=1;i<=m;i++){
ll u,v,w;
std::cin>>u>>v>>w;
edg[u].emplace_back(v,w);
}
const ll d = dj();
printf("found d=%lld\n",d);
if(d==-1){
std::cout<<"0\n";
return;
}
const ll ms=d+k;
ll ans=0;
dq.clear();
dq.emplace_back(1,0);
ll tick=0;
while(dq.size()){
tick++;
if(tick>1e6){
std::cout<<-1<<"\n";
return;
}
auto[now,step]=dq.front();
dq.pop_front();
if(now==n){
ans++;
}
for(auto[v,w]:edg[now]){
const ll ns=w+step;
if(ns>ms)continue;
dq.emplace_back(v,ns);
}
}
std::cout<<ans%p<<"\n";
}
int main(){
std::iostream::sync_with_stdio(false);
std::cin.tie(nullptr);
ll t;
std::cin>>t;
while(t--){
solve();
}
}