社区讨论

求大佬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 条回复,欢迎继续交流。

正在加载回复...