Floyd 學習筆記

#include <cstdio>
#include <cstring>
#include <ctype.h>
#include <cstdlib>
#include <cmath>
#include <climits>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <map>
#include <stack>
#include <set>
#include <list>
#include <numeric>
#include <sstream>
#include <iomanip>
#include <limits>

#define CLR(a, b) memset(a, (b), sizeof(a))
#define pb push_back
#define debug puts("***debug***");

using namespace std;
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
typedef pair <int, int> pii;
typedef pair <ll, ll> pll;
typedef pair<string, int> psi;
typedef pair<string, string> pss;

const double PI = acos(-1.0);
const double E = exp(1.0);
const double eps = 1e-30;

const int INF = 0x3f3f3f3f;
const int maxn = 3e2 + 10;
const int MOD = 1e9 + 7;

int G[maxn][maxn];

int n;

void Floyd()
{
    // 如果兩個點之間能夠有更短的路徑 那麼必然要引入第三個點 來進行路徑轉移
    // 假如我們藉助第0個點來轉移
    // 那麼我們應該這麼寫

    //  for (int i = 0; i < n; i++)
    //      for (int i = 0; i < n; i++)
    //          if (G[i][j] > G[i][0] + G[0][j])
    //              G[i][j] = G[i][0] + G[0][j];

    // 由於第0個點已經經過轉移後的最優狀態了,那麼我們通過第1個點來轉移的時候,
    // 如果第1個點中有的點是經過第0個點轉移的 那麼 我們通過第1個點轉移,實際上
    // 是先通過第0個點 再經過第1個點轉移  
    // 代碼應該這麼寫

    //  for (int i = 0; i < n; i++)
    //      for (int i = 0; i < n; i++)
    //          if (G[i][j] > G[i][1] + G[1][j])
    //              G[i][j] = G[i][1] + G[1][j];

    // 其實可以知道 每次轉移 都是往下面的點轉移的 那麼可以直接用個FOR 來表示 就是下面的代碼


    for (int k = 0; k < n; k++)         
        for (int i = 0; i < n; i++)
            for (int j = 0; j < n; j++)
                if (G[i][j] > G[i][k] + G[k][j])
                    G[i][j] = G[i][k] + G[k][j];
}

int main()
{
    scanf("%d", &n);
    // input
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            scanf("%d", &G[i][j]);

    Floyd();

    // output
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
            printf("%d", &G[i][j]);
        cout << endl;
    }
}
發佈了292 篇原創文章 · 獲贊 25 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章