警示后人
查看原帖
警示后人
910357
songzhihan2010楼主2023/12/30 13:42

两份代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=5e1+10;
ll n,m;
ll u,v;
ll f[66][N][N];
ll dis[N][N];
int main(){
	memset(dis,1000000,sizeof(dis));
	scanf("%lld%lld",&n,&m);
	while(m--){
		scanf("%lld%lld",&u,&v);
		f[0][u][v]=1;
		dis[u][v]=1;
	}
	for (int h=0;h<=64;h++)
	for (int i=1;i<=n;i++){
		for (int j=1;j<=n;j++){
			for (int k=1;k<=n;k++){
				if(f[h][j][i]==1&&f[h][i][k]==1){
					f[h+1][j][k]=1;//*2
					dis[j][k]=1;
				}
			}
		}
	}
	for (int i=1;i<=n;i++){
		for (int j=1;j<=n;j++){
			for (int k=1;k<=n;k++){
				dis[j][k]=min(dis[j][k],dis[j][i]+dis[i][k]);
			}
		}
	}
	cout<<dis[1][n];
}

和

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=5e1+10;
ll n,m;
ll u,v;
ll f[66][N][N];
ll dis[N][N];
int main(){
	scanf("%lld%lld",&n,&m);
	for (int i=1;i<=n;i++){
		for (int j=1;j<=n;j++){
			dis[i][j]=100000000;
		}
	}
	while(m--){
		scanf("%lld%lld",&u,&v);
		f[0][u][v]=1;
		dis[u][v]=1;
	}
	for (int h=0;h<=64;h++)
	for (int i=1;i<=n;i++){
		for (int j=1;j<=n;j++){
			for (int k=1;k<=n;k++){
				if(f[h][j][i]==1&&f[h][i][k]==1){
					f[h+1][j][k]=1;//*2
					dis[j][k]=1;
				}
			}
		}
	}
	for (int i=1;i<=n;i++){
		for (int j=1;j<=n;j++){
			for (int k=1;k<=n;k++){
				dis[j][k]=min(dis[j][k],dis[j][i]+dis[i][k]);
			}
		}
	}
	cout<<dis[1][n];
}

就是memset的区别,100−>10100->10

2023/12/30 13:42
加载中...