首先讲邻接表的实现,以前一直遇到题目都是用vector模拟,今天遇到一个题目vector超时,于是学习了用数组模拟实现邻接表,新学的数据结构,搞的不是很透彻,记录一下。
其实就是头插法,首先用一个结构体E记录节点的信息,指向那个节点,以及指向节点的权值等信息,给E结构体设置一个next,让它指向H数组,H数组初始化为-1,初始化为-1是为了方便判断某个点直接相连点是否找完了,自己还不是很透彻了,等搞透彻了详细解释,先把实现放在这里方便以后参考,当然H也可以写成结构体形式,写成数组较简单。
int H[N]; //存头节点
struct //记录节点信息
{
int v;
int count;
int next;
}E[N];
int T,n,m,top;
void Readmap(int m) //读图
{
memset(H,-1,sizeof(H));
int top=0;
for(int i=0;i<m;i++){
scanf("%d%d%d",&x[i],&y[i],&c[i]);
E[top].v=y[i];E[top].count=c[i];
E[top].next=H[x[i]];
H[x[i]]=top++;
}
}
其求最短路径还是相对比较快速的,最主要是比较好写,结合邻接表实现起来非常简单,相对于dijkstra 算法来说首先它能够求解给定的图存在负权边,而dijkstra 算法是不能求解的,所以SPFA就好用多了。