社区讨论
刚学oi,求救大佬QAQ
P3953[NOIP 2017 提高组] 逛公园参与者 4已保存回复 13
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 13 条
- 当前快照
- 1 份
- 快照标识符
- @mi6yoajg
- 此快照首次捕获于
- 2025/11/20 12:58 4 个月前
- 此快照最后确认于
- 2025/11/20 15:35 4 个月前
CPP
为何7个点re了qwq
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#define res register int
#define _ 0
const int inf = 2147483647;
const int maxn = 1e5 + 10;
const int maxm = 2e5 + 20;
const int upmax = 51;
int T,N,M,K,P,tot,head[maxn],head2[maxn],dis[maxn],in[maxn][upmax],f[maxn][upmax];
bool vis[maxn];
struct edge{
int to,next,w;
}e[maxm],ex[maxm];
inline int rd(){
int x = 0, f = 1;char c = getchar();
while(c>'9'||c<'0') { if(c=='-') f=-1;c=getchar(); }
while(c>='0'&&c<='9') {x=(x<<3)+(x<<1)+c-'0';c=getchar();}
return x*f;
}
inline void add(int x,int y,int z){
e[++tot].to=y;
e[tot].next=head[x];
e[tot].w=z;
head[x]=tot;
ex[tot].to=x;
ex[tot].next=head2[y];
ex[tot].w=z;
head2[y]=tot;
}
inline void spfa(){
std::queue<int> q;
for(res i = 1 ; i <= N ; i = -~i) dis[i] = inf ;
q.push(N); dis[N] = 0;
while(!q.empty()){
int u = q.front(); vis[u] = 0; q.pop();
for(res i = head2[u]; i; i = ex[i].next){
int to = ex[i].to;
if(dis[to] > dis[u] + ex[i].w){
dis[to] = dis[u] + ex[i].w;
if(!vis[to]){
//vis[to] = 1;
q.push(to);
}
}
}
}
}
inline int dfs (int u, int k) {
if(in[u][k]) return -1;
if(f[u][k]) return f[u][k] ;
in[u][k] = 1;
u == N ? f[u][k] = 1 : 0 ;
for(res i = head[u];i;i=e[i].next){
int invad = dis[e[i].to] - dis[u] + e[i].w;
if (invad <= k) {
int w = dfs (e[i].to,k-invad) ;
if(w == -1) return f[u][k] = -1;
f[u][k] = (f[u][k] + w) % P;
}
}
in[u][k] = 0;
return f[u][k] ;
}
int main(){
T = rd() ;
while(T--){
memset(head,0,sizeof(head));
memset(head2,0,sizeof(head2));
memset(vis,0,sizeof(vis));
memset(in,0,sizeof(in));
memset(f,0,sizeof(f));
// for(res i = 1; i <= tot; i = -~i) {
// e[i].to=e[i].w=e[i].next=ex[i].to=ex[i].next=ex[i].w=0;
// }
tot = 0;
N = rd(); M = rd(); K = rd(); P = rd();
for(res i = 1, x, y, z; i <= M ;i++) {
x = rd(); y = rd(); z = rd();
add(x, y, z);
}
spfa() ;
printf("%d\n",dfs(1,K));
}
return ~~(0^_^0);
}
回复
共 13 条回复,欢迎继续交流。
正在加载回复...