最短路
多源最短路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;
再使用前缀和即可得到想要的效果