SPFA中 正逆邻接表的建立

正邻接表的建立:

先定义一个结构体:

struct node

{

int r,v,w,next;

}Map[];

每输入一组数据 就通过Add函数加入到邻接表中,上图已经说得很明白了,结合着下面的代码备注我认为应该不难理解。

 

void Add(int u,int v,int w)
{
Map[k].u=u;
Map[k].v=v;
Map[k].w=w;
Map[k].next=a[u];//a[u]之前可能有值,为了防止数据的丢失,我们将当前a[U]的值存进Map[k].next中,应为一个k值只对应一个next,所以之前a[u]的值可以得到保存。
a[u]=k;//更新当前a[u]的值//a[]的初始值为-1.
}

 

下面再结合一组数据进行进一步说明:

   u v w

1 2 10
2 1 60
1 3 20
3 4 10
2 4 5
4 1 50
第一步Add(1,2,10)
此时 Map[1].u=1 Map[1].v=2 Map[1].w=10 Map[1].next=-1 a[1]=1;
在第三步Add(1,3,20)时
Map[3].u=1 Map[3].v=3 Map[3].w=20 再次之前a[u]的值为1,u=1,为了防止丢失,所以Map[3].next=a[1]=1,然后a[1]更新为3.
同理第二步a[2]第一次更新时为2,在第四则更新为a[2]=4,Map[4].next=2.


下面说一下逆邻接表的建立:
如果正邻接表的建立,你看懂了,那么逆邻接表的建立就很容易明白了,下面只贴出代码喽~

void Add(int u,int v,int w)
{
Map[k].u=u;
Map[k].v=v;
Map[k].w=w;
Map[k].next=a[v];
a[v]=k;
}
posted @ 2016-07-14 21:29  声声醉如兰  阅读(594)  评论(0编辑  收藏  举报