「One Book 3.4.2 Exercise 3」の最短パス
【出典】
【タイトル説明】
有向グラフを与える 、およびソースポイント 、プログラム出力を書き込んでください そして図 の他の頂点の最短経路すべての有向リングの重みの合計が正である限り、グラフの負のエッジを許可します。頂点ラベルは へ ( は画像です の頂点の数)。
【入力フォーマット】
1行目:正の数 Gは、グラフの頂点の総数を表します。
2行目:ソースポイントを表す整数 ( 、 写真にすることができます 任意の1つの頂点)。
3〜3 隣接行列を含む行 はこの数字を示します。
【出力フォーマット】
含む 行、頂点番号の小さい順から大きい順に、各行はソースポイントを出力します 頂点までの最短距離。各行の具体的な形式については、サンプルを参照してください。
【入力例】
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
【ヒント】
サンプルに対応する図は次のとおりです。
【分析】
この質問の難しさは読むことです。
C / C ++の利点をうまく利用
if(scanf("%d",&a))
できます。これは、aが整数かどうかを判断するために使用できます。
入力がyesの場合、-
自動的にが返され-1
、scanf()
スペースをスキップできます。
読んだ後、フロイドは大丈夫でしょう。
パスカルの編集者はそれほど幸運ではありません。ヾ(•ω• `)o
【コード】
#pragma GCC optimize(3,"Ofast","inline")
#pragma G++ optimize(3,"Ofast","inline")
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#define RI register int
#define re(i,a,b) for(RI i=a; i<=b; i++)
#define ms(i,a) memset(a,i,sizeof(a))
#define MAX(a,b) (((a)>(b)) ? (a):(b))
#define MIN(a,b) (((a)<(b)) ? (a):(b))
using namespace std;
typedef long long LL;
int const N=105;
int const inf=0x3f3f3f;
int n,v;
int f[N][N];
int main() {
scanf("%d%d",&n,&v);
memset(f,inf,sizeof(f));
for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) {
int a;
if(scanf("%d",&a)) f[i][j]=a;
else f[i][j]=inf;
}
for(int k=1; k<=n; k++) for(int i=1; i<=n; i++) for(int j=1; j<=n; j++)
f[i][j]=MIN(f[i][j],f[i][k]+f[k][j]);
for(int i=1; i<=n; i++) if(i!=v)
printf("(%d -> %d) = %d\n",v,i,f[v][i]);
return 0;
}