功能:图论中存储点,边和遍历查找;
介绍:edge[i].w 第i条边的权重
edge[i].to 第i条边的终点
edge[i].next 与第i条边同起点的上一条边的存储位置
head[i] 以i为起点的第一条边的存储位置
1. 添加点边数据
#define maxn 10005
int head[maxn];
struct _edge_//定义结构体数组edge[]存储边的各项信息
{
int w;
int u,
int v;
}edge[maxn];
int cnt=0;//cnt初始化为0
memset(head,-1,sizeof(head));//head[]初始化为-1
void add(int u,int v,int w) //函数add可以添加数据
{
edge[cnt].w=w;
edge[cnt].to=v;
edge[cnt].next=head[u];//上一条以u为起点的边的存储位置 如果前面没有以u为起点的边则使它等于-1
head[u]=cnt++;//当前以u为起点的边的存储位置
}
下面举个例子 有助于理解 (为了尽量好理解 我们省去权重这一项)
边信息 cnt edge[cnt].to edge[cnt].next u head[u]
(1,2) 0 2 -1 1 0
(2,3) 1 3 -1 2 1
(3,4) 2 4 -1 3 2
(1,3) 3 3 0 1 3
(4,1) 4 1 -1 4 4
(1,5) 5 5 3 1 5
(4,5) 6 5 4 4 6
int from=u;//起点为u</span>
for(int i=head[u];i!=-1;i=edge[i].next)//先找到第一个以u为起点的存储位置
{ //再令i为上一条以u为起点的存储位置
to=edge[i].to; //直到i==-1则之前没有以u为起点的边
w=edge[i].w;
}
现在让我们开始查找以某个点为起点的边
借上例 我们来查找以1为起点的边
首先i=head[1]=5;得到最后一个以1为起点的边的存储位置
然后我们就在edge[5]里面找到这条边所有的信息了
下面访问edge[5].next 该值为3 得到上一条以1为起点的边的存储位置
同理我们可以在edge[3]中找到该边所有的信息了
在接下来访问edge[3].next 该值为0 再得到更上面一条以1为起点的边的存储位置
再同理我们可以在edge[0]中找到该边所有的信息了
下面访问edge[0].next==-1;结束
可能文字比较难于理解 下面来为便于理解一发流程图
u=1--->head[1]=5------>edge[5]------->edge[5].next=3----->edge[3]----->edge[3].next=0------->edge[0]
起点 第一个位置 边的信息 上一条边的存储位置 边的信息 再上一条边的存储位置 边的信息
---->edge[0].next=-1
结束
欲知更多相见ACdream的blog 附带传送门
http://blog.csdn.net/acdreamers/article/details/16902023