Floyd 学习笔记

原创 2018年04月15日 21:21:05
#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;
    }
}

人工智能工程师直通车第一期

为满足市场需求,培养更多人工智能人才,CSDN学院特别邀请到有十余年教学经验的中科院教授卿来云老师及有丰富工业级实战经验的智亮老师,为大家带来本次课程。 通往人工智能工程师的直通车,已经准备出发了!这波人工智能的热潮,你真的要错过吗?
  • 2017年10月24日 15:37

bzoj2165 -- 倍增floyd

题意:给定一张有向图,求图中从1开始长度>=m且边数最少的路径经过的边数。   考虑倍增floyd。 令f[p][i][j]表示经过2p条边从i到j的最大长度。 那么f[p][i][j]=max{f[...
  • gjghfd
  • gjghfd
  • 2017-05-26 16:45:57
  • 224

第11周报告2:学会使用循环控制语句解决实际问题

2011年11月18日 (2011-11-18 16:22:38)[编辑][删除] 转载▼ 标签: 杂谈   第11周报告2: 实验目的:学会使用...
  • liuchengcheng123
  • liuchengcheng123
  • 2012-03-05 14:26:39
  • 326

Floyd两种记录路径的方法

①void floyd(){ int i,j,k; for(i=1;i
  • immiao
  • immiao
  • 2014-03-26 18:12:29
  • 2031

Floyd算法优化

Floyd算法优化
  • lanshuizhiyun
  • lanshuizhiyun
  • 2017-09-06 11:47:52
  • 548

Floyd算法及代码演示

Floyd算法与Dijstra的区别在于Floyd计算的是任意两点间的最短路径。 可以这样思考,首先是各点都不允许借路通过,然后依次从第一个点到最后一个点均允许借路通过,每次均取最短路,则到最后求得...
  • ACMLCER
  • ACMLCER
  • 2016-07-20 18:19:39
  • 2228

Floyd算法(matlab实现)

  • 2014年09月08日 18:58
  • 555B
  • 下载

Floyd算法的C&python实现及对比

本次我要给大家带来的是Floyd算法,分别用C语言和python实现,并回溯出完整路径。支持无向赋权图、有向赋权图,不支持权为负数的情况。...
  • zhouweilin56091
  • zhouweilin56091
  • 2015-08-26 00:21:00
  • 1422

floyd算法:我们真的明白floyd吗?

图论里一个很重要的问题是最短路径问题. 这个问题,在离散数学课上会考,数据结构与算法课上会考,图论课上会考,计算机网络里会考.... 解决最短路径问题有几个出名的算法: 1.dijkstra算法,最经...
  • ljhandlwt
  • ljhandlwt
  • 2016-08-02 20:14:18
  • 3742

Floyd算法示例

代码#include int main() { int e[10][10],k,i,j,n,m,t1,t2,t3; int inf=99999999; scanf("%d %d...
  • qq_29630271
  • qq_29630271
  • 2017-03-17 20:00:14
  • 374
收藏助手
不良信息举报
您举报文章:Floyd 学习笔记
举报原因:
原因补充:

(最多只允许输入30个字)