DFS BFS 2007-09-16 15:28
连通分量:无向图的极大连通子图。
强连通图: 在有向图中,任意一对顶点都有路径可达vi->vj同时vj->vi。
强连通分量:有向图中的极大强连通子图。
弱连通图:有向图中,vi->vj但vj不能到vi
for(int i=0;i<n;i++)
for(int j=i+1;<n;j++)
scanf("%d",a[i][j]);
for(int j=0;j<n;j++)
for(int i=j+1;i<n;i++)
a[i][j]=a[j][i];
二、十字链表:出边表+入边表
顶点信息 data firstin firstout
弧结点:tailvex headvex hlink tlink info
弧尾顶点序号 弧头顶点序号 下一个入边 下一个出边 权值
图的遍历:从图中某一顶点出发访遍图中其余顶点,且
使每一个顶点仅被访问一次。
深度优先搜索:DFS
从一个顶点出发,访问他依次访问:未被访问过的邻接点/
基本思想:
《1》选择一个起始点vi,访问他
《2》依次从vi出发,访问未访问过后邻接点vj,以vj为新的
出发点继续进行深度搜索。直到图中所有与vi相连的顶点都访问完毕。
《3》如果还有顶点没有访问,则重新选择起始顶点,<1,2,3>
status DFS(GraphTp g,int v)
{
/* VisitFunc(v);printf("%c",g.vexs[v]) //访问v*/
visited[v]=true;//置标记,访问过了
for(int w=0;w<g.vexnum;w++)
if((visited[w]==false)&&(g.arc[v][w]!=0))//j没有访问过.j与v有边相连
DFS(g,w);
}
stuatus DFStravel(GahpTp G)
{
for(int i=0;i<G.vexnum;i++)
visited[i]=false;//初始化被访问过
for(int j=0;j<G.vexnum;j++)
if(visited[j]==flase)
DFS(G,j);
}
//思考如果网的怎么办
DFS()中把 for(int w=0;w<G.vexnum;w++)
if((visited[w]=false)&&(G.arc[v][w]!=OO))
DFS(G,w);
//思考二:邻接表怎么改:
DFS(GraphTp G,int v)中把
visistFuc(v); printf("%c ",G.adjlist[v].vertex); //访问第V 个顶点信息
visited[v]=true;
for(ArcnodeTP *p=G.adjlist[v].firstarc;p!=NULL;p=p->nextarc)//找第一条出边,依次后移
if(visited[p->adjvex]==false)
DFS(G,p->adjvex);
广度优先搜索:BFS:入队列
基本思想:从图中某个顶点vi出发,访问人他,依次访问与
vi的所有邻接点,然后分别从这些邻接点出发广度优先搜
索其它的顶点,重复这些操作,直到所有顶点都被访问过
status BFS(GraphTp G)
{
for(int i=0;i<G.vexnum;i++)
visited[i]=false;//初始化未被访问过
initQueue(Q);//初始化队列
int count=1;//计数
for(int v=0;v<G.vexnum;v++)
if(visited[v]==false)//访问未被访问过的顶点
{
visited[v]=true;//访问v
printf("%c",G.vexs[v]);
enQueue(Q,v);//把v入队列
while(!QueueEmpty(Q))//队列不空
{
DeQueue(Q,u);//出队列,放在u中
for(int w=0;w<G.vexnum;w++)
if((G.arcs[u][w]!=0)&&(visited[w]==false))
{
visited[w]=true;//访问w
enQueue(Q,w);//w 入队列
}
}
else count++;
printf("%d ",G.num-count+1);//连通分量的个数
}
#define vnum 20
typedef struct graph
{
VertexType vexs[vnum];//顶点信息放在一维数组
int arcs[vnum][vnum];//邻接矩阵
int vexnum,arcnum;//顶点的实际个数,边的实际个数
}GraphTp;
表结点:
adjvex nextarc
表头结点:
vertex firstarc
数组表头结点
adjlist[]
vexnum,arcnum
G:
思考如果是邻接表:
printf("",G.adjlist[v].vertex);//顶点信息
for(ArcnodeTP *p=G.adjlist[v].firstarc;p;p=p->nextarc)
if(!visited[p->adjvex]=false)
{
printf("",G.adjlist[p->adjvex]);
visited[p->adjvex]=true;
enQueue(Q,p->adjvex);
}
}
图的连通分量的计算: 可以算一下进行DFS,BFS的次数