一本通之最短路径

it2026-03-03  10

一个从输入就开始恶心人的题目~~~~~~~~~~~~

显然我们要判断邻接矩阵中的数字并把它赋值给g[i][j]。

介绍个神奇的东西

if是个神奇的函数。当用scanf输入时,有格式占位符。把这两个东西神奇的组合一下,可以判断当前输入的字符是否是整数。

代码如下:

#include<iostream> #include<cstdio> #include<queue> using namespace std; int main() {int k; if(scanf("%d",&k))cout<<"true"<<endl; else cout<<"false"<<endl; }

输入3,输出true

输入 38,输出true

输入k,输出false

这个与快读的判断相比,如果数据是两位数,就不用再计算了。

解决输入,接下来就是求最短路径

因为要求1到每个点的最短路径,所以用floyed比较方便

代码如下

#include<iostream> #include<cstdio> #include<queue> using namespace std; int g[101][101],n,m; const int inf=0x7ffffff; int main() {scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) {for(int j=1;j<=n;j++) g[i][j]=inf; g[i][i]=0; } for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { int b; if(scanf("%d",&b)==1)//如果b是整数 a[i][j]=b; else a[i][j]=INF; } } for(int k=1;k<=n;k++) {for(int i=1;i<=n;i++) {for(int j=1;j<=n;j++) {if(g[i][j]>g[i][k]+g[k][j]) g[i][j]=g[i][k]+g[k][j]; } } } for(int i=1;i<=n;i++) {if(i!=m) printf("%d->%d = %d\n",m,i,g[m][i]); } }

 

转载于:https://www.cnblogs.com/lcez56jsy/p/10744565.html

最新回复(0)