社区讨论

刚学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 条回复,欢迎继续交流。

正在加载回复...