社区讨论
求大佬debug
P3953[NOIP 2017 提高组] 逛公园参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @lzv61iy1
- 此快照首次捕获于
- 2024/08/15 18:57 2 年前
- 此快照最后确认于
- 2024/08/15 20:44 2 年前
CPP
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
int n,m,p,k,tot[2],head[2][100005];
struct edge{
int to,next,w;
}e[2][200005];
void addedge(int u,int v,int w,bool flag){
e[flag][++tot[flag]]=(edge){v,head[flag][u],w};
head[flag][u]=tot[flag];
}
int dist[100005];
bool flag[55][100005];
void spfa(){
memset(flag,0,sizeof(flag));
memset(dist,0x3f,sizeof(dist));
dist[1]=0;
queue<int> q;
q.push(1);
while(!q.empty()){
int x=q.front();
q.pop();
for(int i=head[0][x];i;i=e[0][i].next){
int to=e[0][i].to;
if(dist[x]+e[0][i].w<dist[to]){
dist[to]=dist[x]+e[0][i].w;
if(!flag[0][to]){
q.push(to);
flag[0][to]=1;
}
}
}
}
}
int f[55][100005];
bool check;
void dfs(int K,int x){
if(check)return;
if(flag[K][x]){
check=1;
return;
}
if(f[K][x]!=-1)return;
flag[K][x]=1;
int sum=0;
for(int i=head[1][x];i;i=e[1][i].next){
int to=e[1][i].to;
int tk=K+dist[x]-e[1][i].w-dist[to];
if(tk<0 || tk>k)continue;
dfs(tk,to);
sum+=f[tk][to];
sum%=p;
}
f[K][x]=sum;
flag[K][x]=0;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
memset(flag,0,sizeof(flag));
memset(head,0,sizeof(head));
scanf("%d%d%d%d",&n,&m,&k,&p);
for(int i=1;i<=m;i++){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
addedge(u,v,w,0);
addedge(v,u,w,1);
}
spfa();
memset(f,-1,sizeof(f));
f[0][1]=1;
int ans=0;
memset(flag,0,sizeof(flag));
check=0;
for(int i=0;i<=k;i++){
dfs(i,n);
if(check)break;
ans+=f[i][n];
ans%=p;
}
if(check){
printf("-1\n");
}else{
printf("%d\n",ans);
}
}
return 0;
}
```不知道因为什么原因0环判不出来求帮助调试
回复
共 0 条回复,欢迎继续交流。
正在加载回复...