-
Notifications
You must be signed in to change notification settings - Fork 0
suzhouzc edited this page Jul 9, 2022
·
8 revisions
-
无向完全图的边为:n(n-1)/2
-
极大连通子图:连通子图; 极小连通子图:生成树
-
邻接矩阵和邻接表的对比

-
(主要)深度优先遍历
void DFSTraverse(Graph G)
{
for (v=0 ; v < G.vexnum;++v) visited[v]=o; //初始化辅助数组
for (v=0 ; v< G.vexnum;++v)
if(!visited[v])
DFS(G,V); //连通分量的个数=循环的次数
}
void DFS(Graph G,int v)
{
visited[v]=1;
Visit(v); //访问顶点v
for(w=FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v,w))
if (!visited[w]) DFS(G,w); //访问v的邻接点
}
-
(递归)若以邻接矩阵法表示图,则DFS算法如下:
void DFS(MGraph G,int v)
{ //从v出发深度优先遍历
visited[v];
Visit(v);
for(w=0;w<G.vexnum:w++)
if(G.arcs[v][w].adj&&!visited[w])
DFS(G,w);
}
-
(递归)若以邻接表发表示图,则DFS算法如下:
void DFS(ALGraph G,int v)
{//从v出发的深度优先遍历
visited[v]=1; Visit(v);
for (p=G.vertices[V].firstarc; p ;p=p->nextarc)
if (!visited[p->adjvex])
DFS(G,p->adjvex);
}
-
广度优先遍历非递归遍历图G,类似于数的层次遍历
void BFSTraverse(Graph G)
{
for (v=0;v<G.vexnum;++v) visited[v]=0;
InitQueue(Q);
for(v=0;v<G.vexnum:++v)
if(!visited[v])
{
visited[v]=1;
Visit(v);
EnQueue(Q,v);
while(!QueueEmpty=0)
{
DeQueue(Q,u);
for(w=FirstAdjVex(G,u);w>=0;w=NextAdjVex(G,u,w))
if(!visited[w])
{visited[w]=1;Visit(w);EnQueue(Q,w); }
}
}
}//BFSTraverse
-
求顶点u到其他顶点的最短路径(广度优先算法BFS)
void BFS_MIN_Distance(Graph G,int u){
for(i=0;i<G.vexnum;++i){
int d[i]=⚮; //初始化路径长度
int path[i]=-1; //最短路径从哪个顶点过来
}
d[u]=0;
visited[u]=TRUE;
EnQueue(Q,u);
while(!isEmpty(Q)){
DeQueue(Q,u);
for(w=FirstNeighbor(G,u);w>=0;w=NextNeighbor(G,u,w))
if(!visited[w]){ //w为u尚未访问的邻接顶点
d[w]=d[u]+1; //路径长度加一
path[w]=u; //最短路径应从u到w
visited[w]=TRUE; //设已访问标记
EnQueue(Q,w); //顶点w入队
}
}
}
-
迪杰斯特拉算法(最短路径)