2.7总结

本文介绍了两种经典最短路径算法:Floyd算法和Dijkstra算法,详细阐述了它们的时间和空间复杂度,并提供了代码实现。此外,还讲解了一维和二维差分的概念及其应用,包括如何通过差分数组进行区间数值的修改。这些算法和技术在图论和数据结构中具有重要应用。
摘要由CSDN通过智能技术生成

最短路

多源最短路Floyd算法(时间复杂度O(n^3) , 空间复杂度O(n^2)),

这个办法非常简单,只有数据规模小时且时空复杂度都允许时才能用
代码实现,利用二维数组实现

for(int k = 1; k <= n; k++)//枚举转折点
        {
            for(int i = 1; i <= n; i++)//端点i
            {
                for(int j = 1; j <= n; j++)//端点j
                {
                    if(dis[i][j] > dis[k][j] + dis[i][k])
                    {
                        dis[i][j] = dis[k][j] + dis[i][k];//一次一次的更新最短的距离,
                        //直到所有转折点枚举完
                        //,最后得到的二维数组中的数据就是最短
                    }
                }
            }
迪杰斯特拉算法(Dijkstra)

把二维数组中的数据分为两种,一种是已经确定是最短路径的点,一种是还没有确定最短路径的点,避免了重复的判定

int a[10][10];
int dis[10];
int n;
int book[10];///0表示白色,1表示红色;
void dijkstra()
{
    book[1] = 1;///自己到自己不用求
    int u;
    for(int i = 1; i <= n - 1; i++)
    {
        int minn = 999;
        ///找到距离红色正英最近的u
        for(int j  =1; j <= n; j++)
        {
            if(book[j] = 0 && dis[j] < minn)
            {
                minn = dis[j];
                u = j;
            }
        }
        book[u] = 1;
        for(int j = 1; j <= n; j++)
        {
            if(book[j] = 0 && dis[j] > dis[u] + a[u][j])
            {
                dis[j] = dis[u] + a[u][j];
            }
        }
    }
}
差分笔记
一维差分

相邻连个数之间的差
比如

1 2 3 3 3 3

的差分数组为

1 1 1 0 0 0

差分数组的前缀和就是原数组
如果要给原数组中区间[l,r]中加上一个数c,则需要在差分数组中(设差分数组用b表示)b[l]加上c,b[r + 1]减去c即可

二维差分

记住公式 ,想要得到差分数组

p[i][j] =  a[i][j] - a[i - 1][j] - a[i][j - 1] + a[i - 1][j - 1]

如果想要让区间(x1,y1)到(x2, y2)之间的数都加上c
计算方法

a[x1][y1] += c;
a[x1][y2 + 1] -= c;
a[x2 + 1][y1] -= c;
a[x2 + 1][y2 + 1] -= c;

再使用前缀和即可得到想要的效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值