图的存储:
目前主要的方式有两种:
邻接矩阵
定义:
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;
}
}
}