mirror of
https://gitcode.com/Zengtudor/alg2025.git
synced 2025-11-06 06:43:49 +00:00
feat: 添加P3953.cpp实现最短路径计数功能
实现了一个基于Dijkstra算法的最短路径计数解决方案,用于计算在给定约束条件下从起点到终点的路径数量。包含输入处理、最短路径计算和路径计数逻辑。当路径步数超过阈值时返回-1,否则返回路径数模p的结果。
This commit is contained in:
parent
8aeb58ec32
commit
a788926d44
93
src/11/5/P3953.cpp
Normal file
93
src/11/5/P3953.cpp
Normal 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();
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user