可以图中联通的多个点当做一条条的“链”,这些边则是把这些点“串联”在一起(即存在类似树种的父子节点关系,若题目无特殊指明为有向图,故默认为无向图,因为一条边中的两个节点都可能是父节点或子节点,故需要正反两次建边进行链式存储)
定义struct Edge{int to,next;}edge[n*2+1]; 定义结构体Edge和Edge结构体数组edge,其中to表示edge数组的当前下标i表示的父节点i指向的子节点to,而next表示在edge数组中,以前点i为父节点的前一条边的下标,故可以通过i=edge[i].next的方法,就可以把当前父节点i转移到子节点to
定义一个int head[n+1],head数组故名头,假设head数组的某下标为i,则i表示以点i为父节点的最后一条边的下标,找到该下标就可以通过数组edge的next下标找到以i为父节点的上一条边。
定义一个int cnt=0;每次添加一条边时都提前进行cnt++;表示在数组edge种多一条边,且更新当前父节点i最新在edge数组的下标
具体代码实现如下:
struct Edge{
int to;
int next;
//int w; //有时候题目说明边有权值时可以添加一个变量w
}edge[MAX<<1];
int head[MAX + 5], cnt;
//头,链式前向星存图,点head[x]表示点x所在边在edge数组出现最后一次的下标
void edge_add(int u, int v) { //添加由点u指向点v的边
edge[++cnt].to = v;
edge[cnt].next = head[u];
head[u] = cnt;
}
对图的遍历
void dfs(int now){
//具体操作
for(int i=head[now];i!=0;i=edge[i].next){
//具体操作
dfs(edge[i].to);
}
}
之前做题的时候没有总结,蹭着做课设时不想用指针做链表存储而重新滤了一遍就匆忙写了下想法,上述表格我没检查,有可能不对的,希望大家原谅。