社区讨论
非常好的段错误,使我求助神犇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 条回复,欢迎继续交流。
正在加载回复...