社区讨论
真是神了...找不到一点错...就是30 剩下的全wa
P3953[NOIP 2017 提高组] 逛公园参与者 10已保存回复 11
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 11 条
- 当前快照
- 1 份
- 快照标识符
- @mi6wxui8
- 此快照首次捕获于
- 2025/11/20 12:10 4 个月前
- 此快照最后确认于
- 2025/11/20 15:10 4 个月前
CPP
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
const int INF = 1e9 + 7 ;
const int MAXN = 1e5 + 10 ;
const int MAXM = 2e5 + 10 ;
const int upmax = 50;
const int swp = 2e5 + 10 ;
using namespace std ;
int in[MAXN][upmax] ;
int dis[MAXN], f[MAXN][upmax] ;
int vis[MAXN] ;
int undis[MAXN] ;
int cnt = 0, tot = 0, N, M, K, P;
int last[MAXN],head[MAXN] ;
struct Edge1 { int to, next, w;}e1[MAXM];
struct Edge2 { int to, next, w;}e2[MAXM];
inline void mod (int& a){ a >= P ? a -= P : 0; }
inline void add (int u,int v ,int w) {
e1[++cnt].next = last[u], e1[cnt].to = v, e1[cnt].w = w;
last[u] = cnt ;
return ;
}
inline void SPFA () {
queue<int> q;
// while (!q.empty()) q.pop() ;
for (int i = 1; i <= 100000; i++) dis[i] = INF, vis[i] = 0;
q.push(N) ; dis[N] = 0; vis[N] = 1;
while (!q.empty()) {
int x = q.front() ;
q.pop() ;
vis[x] = 0;
for (int i = head[x]; i; i = e2[i].next) {
int to = e2[i].to ;
if (dis[to] > dis[x] + e2[i].w) {
dis[to] = dis[x] + e2[i].w ;
if (vis[to]) continue ;
q.push(to) ;
vis[to] = 1;
}
}
}
}
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 (int i = last[u]; i; i = e1[i].next) {
int invad = dis[e1[i].to] - dis[u] + e1[i].w ;
if (invad <= k) {
int w = dfs (e1[i].to,k - invad) ;
if (w == -1) return f[u][k] = -1;
mod (f[u][k] += w) ;
}
}
return in[u][k] = 0,f[u][k] ;
}
int main () {
int T;
scanf("%d",&T) ;
while (T--) {
cnt = tot = 0 ;
for (int i = 1; i <= 100000; i++) last[i] = head[i] = 0;
for (int i = 0; i <= swp; i++) {
e1[i].next = e2[i].next = e2[i].w = e1[i].w
= e1[i].to = e2[i].to = 0 ;
}
memset (f,0,sizeof(f)), memset (dis,INF,sizeof(dis));
memset (in,0,sizeof(in)) , memset (undis,INF,sizeof(undis)) ;
scanf("%d%d%d%d",&N,&M,&K,&P) ;
for (int i = 1; i <= M; i++) {
int x, y, z;
scanf("%d%d%d",&x,&y,&z);
add (x, y, z) ;
e2[++tot].next = head[y], e2[tot].to = x, e2[tot].w = z;
head[y] = tot ;
}
SPFA () ;
printf ("%d\n",dfs(1,K)) ;
}
}
回复
共 11 条回复,欢迎继续交流。
正在加载回复...