我这条咸鱼又来啦!!啊哈算法看到结尾部分,大佬说要给我几个题测测我到什么水平了,于是就有了这篇在被虐中写出的博客,不废话了,粘题
大佬告诉我说这是一道裸的不能再裸的最短路题,但我还是挂了好几次(咸鱼没跑了)
先粘上我开始的错误代码再慢慢说
#include<bits/stdc++.h>
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<bits/stdc++.h>
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循环的判断条件导致超时,所以在这里先不继续讨论,等之后搞清楚了再回来填这个坑
题外话:
据大佬所说,这只是一道普及-的题,我还是做的这么费劲,感觉后面各种提高题可能会把我做死,看来真·咸鱼说的就是我了,希望以后能和大佬越来越接近吧