对不起,我犯的错误才脑残,请大佬不要管我这个蒟蒻
应该把Floyd算法中枚举中间点的循环放在最外面
int dis[105][105], cnt[105][105], n, m;
void floyd(){
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(k==i || k==j || i==j) continue;
if(dis[i][k]+dis[k][j]==dis[i][j]) cnt[i][j]+=cnt[i][k]*cnt[k][j];
else if(dis[i][k]+dis[k][j]<dis[i][j]) cnt[i][j]=cnt[i][k]*cnt[k][j], dis[i][j]=dis[i][k]+dis[k][j];
}
}
}
}
而不是:
void floyd(){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
for(int k=1;k<=n;k++){
if(k==i || k==j || i==j) continue;
if(dis[i][k]+dis[k][j]==dis[i][j]) cnt[i][j]+=cnt[i][k]*cnt[k][j];
else if(dis[i][k]+dis[k][j]<dis[i][j]) cnt[i][j]=cnt[i][k]*cnt[k][j], dis[i][j]=dis[i][k]+dis[k][j];
}
}
}
}