【最短路算法】最短路径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(); }

                
            
        
浙公网安备 33010602011771号