社区讨论

非常好的段错误,使我求助神犇debug

P3953[NOIP 2017 提高组] 逛公园参与者 1已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@m0dqxl5q
此快照首次捕获于
2024/08/28 19:01
2 年前
此快照最后确认于
2024/08/28 21:00
2 年前
查看原帖
CPP
#include <iostream>
#include <queue>
#include <cstring>
#include <set>
using namespace std;
int t;
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];
}
long long dist[100005];
bool flag[55][100005];
set<pair<int,int> > heap;
void dijkstra(){
    memset(dist,0x3f,sizeof(dist));
    dist[1]=0;
    
    heap.insert(make_pair(0,1));
    while(!heap.empty()){
        int x=heap.begin()->second,val=heap.begin()->first;
        heap.erase(heap.begin());
        if(val>dist[x])continue;
        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;
                heap.insert(make_pair(dist[to],to));
            }
        }
    }
}
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;
    }
    if(K==0 && x==1)sum=1;
    f[K][x]=sum;
    flag[K][x]=0;
}
int main(){
    freopen(R"(E:\P3953_10.in)","r",stdin);
    freopen(R"(E:\out.txt)","w",stdout);
    int n;
    cin >> n;
    for(int i=1;i<=n;i++){
        
    }
    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);
        }
        dijkstra();
        memset(f,-1,sizeof(f));
        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;
}

/* 第十组测试数据 在第五十行报错,i的值是0x3f3f3f3f 求大佬debug */

回复

1 条回复,欢迎继续交流。

正在加载回复...