额
如何访问图中每个点???
那就要说强大的遍历了
深度优先遍历(dfs)
算法思路
对于一个图,找其中第一个点,不断往下搜索,每个搜过的点处理并标记,直到他所有邻接点搜完,便返回父节点。
代码
//邻接矩阵
Void dfs(int k);
{
printf(“%d”,k);
f[k]=true;
for (int j=1;j<=n;j++)
if ((!f[j])&& a[k][j]) dfs(j);
}
//邻接表
void dfs(int k)
{
for (int i=linkk[k];i;i=e[i].next)
if(!vis[e[i].y])
{
vis[e[i].y]=1;
dfs(e[i].y);
}
}
图示
求连通分量
用dfs可以求连通分量
sum=0;
for (int i=1;i<-n;i++)
if (! f[i])
{
sum++;
dfs(i);
}
cout<<sum;
广度优先遍历(bfs)
概念
用队列存遍历的点,每次搜队头,就可以完成bfs
代码
//邻接矩阵
void bfs(int s)
{
int head=0,tail=1;
int q[maxn];
q[1]=s;
f[s]=1;
while (++head<=tail)
{
int tn=q[head];
cout<<tn<<' ';
for(int i=1;i<=n;i++)
if (a[tn][i]==1&&!f[i])
{
q[++tail]=i;
f[i]=1;
}
}
}
//邻接表
void bfs(int s)
{
int head=0,tail=1;
int q[maxn];
q[1]=s;
f[s]=1;
while (++head<=tail)
{
int tn=q[head];
cout<<tn<<' ';
for(int i=linkk[tn];i;i=a[i].next)
{
int y=a[i].y;
if(!f[y])
{
q[++tail]=y;
f[y]=1;
}
}
}
}
图示
上接图论存储http://blog.csdn.net/OIer00LCJ/article/details/78915635