[C ++]「One Book 3.4.2 Exercise 3」(ショップ)の最短経路

【出典】

一本通-1378

【タイトル説明】

有向グラフを与える G = V E G =(V、E) 、およびソースポイント v 0 V v_0∈V 、プログラム出力を書き込んでください v 0 v_0 そして図 G G の他の頂点の最短経路すべての有向リングの重みの合計が正である限り、グラフの負のエッジを許可します。頂点ラベルは 1 1 は画像です G G の頂点の数)。

【入力フォーマット】

1行目:正の数 2 80 n(2≤n≤80) Gは、グラフの頂点の総数を表します。

2行目:ソースポイントを表す整数 v 0 v_0 v 0 V v_0∈V v 0 v_0 写真にすることができます G G 任意の1つの頂点)。

3〜3 n + 2 n + 2 隣接行列を含む W W はこの数字を示します。

【出力フォーマット】

含む n 1 n-1 行、頂点番号の小さい順から大きい順に、各行はソースポイントを出力します v 0 v_0 頂点までの最短距離。各行の具体的な形式については、サンプルを参照してください。

【入力例】

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の場合、-自動的にが返され-1scanf()スペースをスキップできます。

読んだ後、フロイドは大丈夫でしょう。

パスカルの編集者はそれほど幸運ではありません。ヾ(•ω• `)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;
}
元の記事を106件公開 156 件を賞賛 40,000回以上の閲覧

おすすめ

転載: blog.csdn.net/Ljnoit/article/details/105357048