如果你floyd 50pts
查看原帖
如果你floyd 50pts
551417
CommonDigger楼主2024/7/13 16:48

对不起,我犯的错误才脑残,请大佬不要管我这个蒟蒻

应该把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];
			}
		}
	}
}
2024/7/13 16:48
加载中...