对于图可以用邻接矩阵或邻接表,当边很少时邻接矩阵很浪费空间,而邻接表可以用vector来实现,在做题时有一种链式前向星存图,其实现原理其实和邻接表很类似:
struct Node
{
int to; //这条边所指向的点
int w; //这条边的权值
int next; //下一条边的编号
}e[MAXN];
另外还要定义一个head[ ]数组,head[a] 表示以第a个结点为起点的第一条边的编号
将一条边存储在数组中的函数为:
void add(int x,int y,int z) //表示将一条从x指向y的权值为z的有向边添加到链表之中
{
cnt++; //cnt为边的编号
e[cnt].to=y; //将新边的to赋值成为y,表示这条边指向y
e[cnt].w=z; //将新边的w赋值成为z,表示这条边的值为z
e[cnt].next=head[x]; //将新边的next指向原来head[a]指向的边的编号
head[x]=cnt; //让head[x]指向当前边的编号,表示这条边是以x为起始节点
}
遍历以P为起始点的所有边:
for(int i=head[p]; i!=0; i=e[i].next)
{
printf("%d %d %d", p, e[i].to, e[i].w);
}
我们可以通过head数组找到以p为开头的第一条边,并用next一直找下去,因为head数组最开始为0,所以当i等于0时,就是结束。