图的存储:
目前主要的方式有两种:
邻接矩阵
定义:
bool b[max_l][max_l];
插入:
b[x][y]=true;
查询:
if (b[x][y]);
空间复杂度较高,查询两点间是否有边为O(1)
邻接表
定义:
struct hazaking { int y; int next; }e[max_l]; int linkk[max_l];
插入:
e[++t].y=Y; e[t].next=linkk[X]; linkk[X]=t;
遍历:
for (int i=linkk[k];i;i=e[i].next);
空间复杂度较好
边表懒得说了
部分算法需要使用其他存储结构
图的遍历:
DFS:
邻接矩阵:
void dfs(int k) { vis[k]=true; for (int i=1;i<=n;i++) if(b[k][i] && !vis[i]) dfs(i); }
邻接表:
void dfs(int k) { vis[k]=true; for (int i=links[k];i;i=e[i].next) if (!vis[e[i].y]) dfs(e[i].y); }
BFS:
邻接矩阵:
void bfs(int k) { int h=0; int t=1; q[1]=k; while(h<t) { h++; for (int i=1;i<=n;i++) if (b[q[h]][i] && !vis[i]) { vis[i]=true; q[++t]=i; } } }
邻接表:
void bfs(int k) { int h=0; int t=1; q[1]=k; while(h<t) { h++; for (int i=links[q[h]];i;i=e[i].next) if (!vis[e[i].y]) { vis[e[i].y]=true; q[++t]=e[i].y; } } }