社区讨论

真是神了...找不到一点错...就是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 条回复,欢迎继续交流。

正在加载回复...