最近在优化师姐的论文,主要研究大规模图的可达性问题,原本就对图算法很模糊的我,显得更加糊涂。原来就对图的一些遍历算法就不是很了解,在阅读了算法设计手册之后,略有所悟。对于本文章有不足之处,希望各位批评指正。
对于每一个算法,数据结构的在算法的实现的过程中显得非常重要。下面就是我写的数据结构,当然是关于图的啦。这里主要是采用链表来存储每一个点的字节点。
struct edgenode{
int y;//下一个邻接点
int weight;//这一条边的权重
edgenode * next;//邻接点链表
};
struct graph{
int nvertex;//顶点个数
int nedges;//边的个数
int degree[MAX+1];//入度
edgenode *nodes[MAX+1];//邻接点
bool directed;//是否为有向图
};
对于广度优先,主要的思想是:给一个开始的点,然后找它的邻接点,如果邻接点没有被访问,加入队列, 然后在遍历队列。
void dfs(graph *g,int start)
{
edgenode *p;
queue<int> q;
q.push(start);
discovered[start]=true;
while(!q.empty())
{
int x=q.top();
q.pop();
p=g->nodes[x];
if(!processed[x])
{
cout<<x<<" ";
processed[x]=true;
}
while(p)
{
int y=p->y;
if(!processed[y]&&!discovered[y])
{
parent[y]=x;
q.push(y);
discovered[y]=true;
}
p=p->next;
}
}
}
我这里添加了processed数组来判断该节点的处理,从以上代码可以看出,这里只是仅仅将节点答应出来。对于bfs,由于遍历了个点和边,时间复杂度为O(|V|+|E|)。