邻接表 h[]
(存储 图 和 树)。
-
相当于n个单链表。
-
head 就变为一个 h[] 数组。 每一个结点都是头结点。
-
树是一种特殊的图:无环连通图。
-
无向图就是一种特殊的有向图,无向图建两条边即可。
-
NE[x]存储此点一步能到的所有点的idx下标,一般用头插法。
E[x] 是 这条边的真正下标; h 存所有节点的头结点(下一个点中的一个)取出来再用NE遍历。
NE 和 E 都是边的数量。如果是双向的就*2;
static int h[]; //头节点 static int NE[]; //链表 static int E[]; //边 static int w[]; //边权 static int idx; //边的下标 static void add(int a,int b){ E[idx] = b; NE[idx] = h[a]; h[a] = idx; idx++; } static void dfs(int u,int f){ // 深度优先 for(int i = h[u];i!=-1;i = NE[i]){ int j = E[i]; if(u == f) continue; //防止往回走 dfs(j,u); } } static void bfsT(int u) { //宽度优先 push(u); while(hh<=tt){ for (int i = h[u]; i != -1; i = NE[i]) { int j = E[i]; if (st[j]==false) { Q[++tt] = j; st[j] = true; // 标记一下,记录为已经被搜索过了 } } } }