最短路 -- 建图

1.存图方式
1)邻接矩阵
在这里插入图片描述在这里插入图片描述
申请一个二维数组map[maxn][maxn],初始化map[i][i] = 0,其余map[i][j] = -inf(i!=j),表示不连通。
例 2 3 5,map[2][3] = map[3][2] = 5 (无向图)||map[2][3] = 5(有向图)
适合稠密图,或者需要用flody算法的场景,当样例大时存储空间需要较多。
注意,题目可能有重边。此时再给出一个2 3 6,需要判断
if(map[2][3] > dis)
map[2][3] = 6;
2)邻接表
这里用vector实现,需要的有结构体记录边
vectoredges;//边集
struct Edge{
int from,to,dis;//起始点,重点,距离
};
最短路时同时还需要记录点信息的结构体,记录从该点出发的边的情况
vectorG[maxn];//每个节点出发的边编号
struct HeapNode{
int d,u;
bool operator < (const HeapNode& rhs) const{
return d > rhs.d;
}
};
加边
void AddEdge(int from,int to,int dis){
edges.push_back((Edge){from,to,dis});
//edges.push_back((Edge){to,from,dis});//无向图/边
m = edges.size();
G[from].push_back(m-1);
}
3)链式前向星
用这个结构体存边
struct Edge{
int next,to,dis;// 第i条边同起点的下一条边的存储位置,终点,距离
};
和上个方法的不同点在于如何记录从点出发的边的信息。
这里用了一个数组head[maxn]记录 用来表示以i为起点的第一条边存储的位置,一般初始化为-1
加边
void add(int u,int v,int w)
{
edge[cnt].dis = w;
edge[cnt].to = v;
edge[cnt].next = head[u];
head[u] = cnt++;
}
注意这里的next不是下一个点,而是
https://www.cnblogs.com/wenruo/p/4680930.html图示帮助理解

2)建图
1)题目给出简单有向/无向边,直接用上述函数/数组赋值即可。
2)题目给出各点坐标
这一块是比较难处理的。假如题目给出n个点以及坐标,求1-n的最短路。在建图的时候难道每个边之间都要建边吗?那这样将要存储n^2个边,数据量大的时候明显是会爆空间的。
不同题目背景有不同的优化方法,比如排序或者分层。今后遇到不同情况的时候一一汇总。
例题poj2502
3)分层/二分,可以每一个层用一个源点连接起来,然后各层之间通过源点链接。

猜你喜欢

转载自blog.csdn.net/qq_42937838/article/details/108219323