一本通之最短路径

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

显然我们要判断邻接矩阵中的数字并把它赋值给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]);
  }
}

 

posted @ 2019-04-21 15:21  千载煜  阅读(214)  评论(0编辑  收藏  举报