本蒟蒻调了将近两个小时的代码(吸氧后50,非A即T):
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
long long n,m,timex[205],road[205][205],q,x[50005],y[50005],t[50005],tx,ty,fo[205][205],t_n,v_num[50005];
bool v[205];
int main(){
memset(fo,0x3f3f3f3f,sizeof(fo));
scanf("%lld%lld",&n,&m);
for(long long i=0;i<n;i++){
scanf("%lld",&timex[i]);
fo[i][i]=0;
}
for(long long i=0;i<m;i++){
scanf("%lld%lld",&tx,&ty);
scanf("%lld",&fo[tx][ty]);
fo[ty][tx]=fo[tx][ty];
}
scanf("%lld",&q);
for(long long i=0;i<q;i++){
scanf("%lld%lld%lld",&x[i],&y[i],&t[i]);
}
int j;
for(long long i=0;i<q;i++){
for(j=0;timex[j]<=t[i]&&j<n;j++){
for(long long k=0;k<n;k++){
for(long long l=0;l<n;l++){
if(fo[k][l]>fo[k][j]+fo[j][l]){
fo[k][l]=fo[k][j]+fo[j][l];
}
}
}
}
if(timex[x[i]]>t[i]||timex[y[i]]>t[i]||fo[x[i]][y[i]]>=0x3f3f3f3f) printf("-1\n");
else printf("%lld\n",fo[x[i]][y[i]]);
}
return 0;
}
看了题解以后改的(吸氧后AC):
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
long long n,m,timex[205],road[205][205],q,x[50005],y[50005],t[50005],tx,ty,fo[205][205],t_n,v_num[50005];
bool v[205];
int main(){
memset(fo,0x3f3f3f3f,sizeof(fo));
scanf("%lld%lld",&n,&m);
for(long long i=0;i<n;i++){
scanf("%lld",&timex[i]);
fo[i][i]=0;
}
for(long long i=0;i<m;i++){
scanf("%lld%lld",&tx,&ty);
scanf("%lld",&fo[tx][ty]);
fo[ty][tx]=fo[tx][ty];
}
scanf("%lld",&q);
for(long long i=0;i<q;i++){
scanf("%lld%lld%lld",&x[i],&y[i],&t[i]);
}
for(long long i=0;i<q;i++){
while(timex[j]<=t[i]&&j<n){
for(long long k=0;k<n;k++){
for(long long l=0;l<n;l++){
if(fo[k][l]>fo[k][j]+fo[j][l]){
fo[k][l]=fo[k][j]+fo[j][l];
}
}
}
j++;
}
if(timex[x[i]]>t[i]||timex[y[i]]>t[i]||fo[x[i]][y[i]]>=0x3f3f3f3f) printf("-1\n");
else printf("%lld\n",fo[x[i]][y[i]]);
}
return 0;
}
两者只有一个循环有不同,就是一个用for,一个用while,结果相差50分,有大佬知道是什么问题吗?(解答必关)