【最短路算法】最短路径3

一、题号606

  题目描述:给定一个有向图G(V,E)以及一个源点v,求v到其它所有点的最短路径。只要所有的有向环权值和都是正的,我们就允许图的边有负值。顶点的标号从1到n(n为图G的顶点数)。注意:边权较大,请使用long long。

  输入格式:第一行一个整数n(1<=n<=80),表示图G的顶点数;第二行一个整数v,表示源点;第3~n+2行用邻接矩阵W给出了这个图(“—”后面是空格表示两点间无连线,“—”后面跟一个整数表示负号)。

  输出格式:请按照样例格式输出v到其它所有点的最短路径。

  样例输入:

5
1
0 2 - - 10
- 0 3 - 7
- - 0 4 -
- - - 0 5
- - 6 - 0

  样例输出:

(1 -> 2) = 2
(1 -> 3) = 5
(1 -> 4) = 9
(1 -> 5) = 9

二、思路分析:这肯定是一道最简单的板子题吧......解决这个输入。既然数据范围很小,给的还是邻接矩阵,那读入后用Floyd就解决了。

三、知识补充:关于scanf()的返回值(这个题的正解是用类似快读的字符判断)

scanf()的返回值的意义就是函数内是否有数输入成功了(仅对于单个输入,且类型为int),如下例代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int a,b;
    int x=0;
    x+=scanf("%d",&a);
    printf("%d\n",x);
    x+=scanf("%d",&b);
    printf("%d\n",x);
}

如果输入(整数 整数);程序依次输出 1 2(a输入成功x++;b输入成功x++)

如果输入(字符 整数);程序依次输出 0 1(a输入失败x+=0;b输入成功x++)

如果输入(字符 字符);程序依次输出 0 0(a,b均输入失败x+=0)

按照这个特性,那么当输入数据时,判断sacnf()的返回值即可

四、Solution:

#include<bits/stdc++.h>
#define Inf 300100010009//一定要将极大值开得大一点
#define MAX 90
using namespace std;
typedef long long ll;
ll n,m;
ll G[MAX][MAX];
void read()
{
    scanf("%lld%lld",&n,&m);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            ll x;
            if(scanf("%lld",&x)) G[i][j]=x;//如果输入成功(输入的为数字)就进行赋值
            else G[i][j]=Inf;//否则赋为极大值
        }
    }
}
void Floyd()//Floyd最短路板子
{
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            for(int k=1;k<=n;k++)
            {
                if(i==j||i==k||j==k) continue;
                G[j][k]=min(G[j][k],G[j][i]+G[i][k]);
            }
        }
    }
}
void output()
{
    for(int i=1;i<=n;i++)
    {
        if(m==i) continue;
        printf("(%lld -> %d) = %lld\n",m,i,G[m][i]);//注意输出格式
    }
}
int main()
{
    read();
    Floyd();
    output();
}

 

posted @ 2022-07-01 09:39  正在加载90%  阅读(48)  评论(0)    收藏  举报