浅谈Floyd解决最短路问题

我这条咸鱼又来啦!!啊哈算法看到结尾部分,大佬说要给我几个题测测我到什么水平了,于是就有了这篇在被虐中写出的博客,不废话了,粘题
浅谈Floyd解决最短路问题_第1张图片
大佬告诉我说这是一道裸的不能再裸的最短路题,但我还是挂了好几次(咸鱼没跑了
先粘上我开始的错误代码再慢慢说

#include
using namespace std;
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int n,m,u,v,w,e[100][100];
	int inf=99999;
	cin>>n>>m;
	while(n!=0||m!=0){
		memset(e,0,sizeof(e));
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
				if(i==j)
					e[i][j]=0;
				else
					e[i][j]=inf;
		for(int i=1;i<=m;i++){
			cin>>u>>v>>w;
			e[u][v]=w;
			e[v][u]=w;
		}
		for(int k=1;k<=n;k++)
			for(int i=1;i<=n;i++)
				for(int j=1;j<=n;j++)
					if(e[i][j]>e[i][k]+e[k][j])
						e[i][j]=e[i][k]+e[k][j];
		cout<<e[1][n]<<endl;
		cin>>n>>m;
	}
}

这段代码看着没有毛病(只是对我来说看着没有毛病) ,样例啥的也都能过,但交题的时候出现了超时的毛病,开始时我以为是for循环初始化矩阵导致运行时间变长,也就是下面这一段程序

for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
				if(i==j)
					e[i][j]=0;
				else
					e[i][j]=inf;

但大佬告诉我这个for循环是自环,只是从1到n,时间上可以忽略不计,然后大佬把他的代码发给了我让我比着改改,最后终于过了可把我牛逼坏了,这里再粘上对的代码

#include
using namespace std;
int e[1000][1000];
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);//关闭c语言里面的输入输出
	int n,m,u,v,w;
	int inf=99999;
	while(cin>>n>>m&&m&&n){
		memset(e,0,sizeof(e));//初始化数组e
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
				if(i==j)
					e[i][j]=0;
				else
					e[i][j]=inf;//for循环初始化矩阵
		for(int i=1;i<=m;i++){
			cin>>u>>v>>w;//使用for循环保存两个点和两点间的距离
			e[u][v]=w;//e[u][v]中表示从u到v,w表示u和v之间的距离
			e[v][u]=w;//因为是无向最短路,所以反过来也是一样
		}
		for(int k=1;k<=n;k++)//Flody核心代码
			for(int i=1;i<=n;i++)
				for(int j=1;j<=n;j++)
					if(e[i][j]>e[i][k]+e[k][j])//判断最短路
						e[i][j]=e[i][k]+e[k][j];//更新最短路
		cout<<e[1][n]<<endl;//输出从起点到终点的最短距离
	}
}

在这里,我将while循环的条件做了修改

	//修改前
	cin>>n>>m;
	while(n!=0||m!=0)
	//修改后
	while(cin>>n>>m&&m&&n)

由于不清楚是不是因为while循环的判断条件导致超时,所以在这里先不继续讨论,等之后搞清楚了再回来填这个坑

题外话:
据大佬所说,这只是一道普及-的题,我还是做的这么费劲,感觉后面各种提高题可能会把我做死,看来真·咸鱼说的就是我了,希望以后能和大佬越来越接近吧

你可能感兴趣的:(算法)