样例没过,AC了?
查看原帖
样例没过,AC了?
658786
STUDENT00楼主2022/8/26 20:33

Input: 2 5 7 2 10 1 2 1 2 4 0 4 5 2 2 3 2 3 4 1 3 5 2 1 5 3 2 2 0 10 1 2 0 2 1 0 Output: 3 -1 My Output: 3 1 Code:

#include<bits/stdc++.h>
using namespace std;
int t,n,m,k,p,x,y,z,num[100010],num2[100010],dis[100010],dp[100010][55],ans;
struct node{
	int q,s;
};
vector<node> a[100010],b[100010];
queue<int> qt;
bool vis[100010],vis2[100010][55],flag;
int dfs(int now,int k){
	if(dp[now][k]!=-1) return dp[now][k];
	dp[now][k]=0;
	vis2[now][k]=1;
	for(int i=0;i<num2[now];i++){
		int c=b[now][i].q,x=dis[now]-dis[c]+k-b[now][i].s;
		if(x>=0){
			if(vis2[c][x]) flag=1;
			dp[now][k]=(dp[now][k]+dfs(c,x))%p;
		}
	}
	vis2[now][k]=0;
	return dp[now][k];
}
int main(){
	scanf("%d",&t);
	while(t--){
		scanf("%d%d%d%d",&n,&m,&k,&p);
		memset(num,0,sizeof(num));
		memset(num2,0,sizeof(num2));
		for(int i=1;i<=n;i++){
			a[i].clear();
			b[i].clear();
		}
		while(m--){
			scanf("%d%d%d",&x,&y,&z);
			a[x].push_back({y,z});
			num[x]++;
			b[y].push_back({x,z});
			num2[y]++; 
		}
		qt.push(1);
		memset(vis,0,sizeof(vis));
		memset(dis,127,sizeof(dis));
		vis[1]=1;
		dis[1]=0;
		while(!qt.empty()){
			int now=qt.front();
			vis[now]=0;
			for(int i=0;i<num[now];i++){
				if(dis[a[now][i].q]>dis[now]+a[now][i].s){
					dis[a[now][i].q]=dis[now]+a[now][i].s;
					if(!vis[a[now][i].q]){
						vis[a[now][i].q]=1;
						qt.push(a[now][i].q);
					}
				}
			}
			qt.pop();
		}
		memset(dp,-1,sizeof(dp));
		dp[1][0]=1;
		ans=0;
		flag=0;
		for(int i=0;i<=k;i++) ans=(ans+dfs(n,i))%p;
		if(flag) printf("-1\n");
		else printf("%d\n",ans);
	}
	return 0;
}
2022/8/26 20:33
加载中...