5.3.1连通图的深度优先搜索

None.gif #include  " stdafx.h "
None.gif#include 
< iostream.h >
None.gif#include 
< malloc.h >
None.gif
None.gif
// 邻接表,存储P114的5-10
None.gif
#define  vnum 8
None.gif
None.gif
// 单链表定义
None.gif
typedef  struct  arcnode
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
int adjvex;                                            //与其相连的下个结点的编号
InBlock.gif
    struct arcnode * nextarc;                            //指向下一个结点的指针
ExpandedBlockEnd.gif
}
ArcNodeTp;
None.gif
None.gif
// 头结点定义
None.gif
typedef  struct  vexnode
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
int vertex;                                            //结点编号
InBlock.gif
    ArcNodeTp * firstarc;                                //指向单链表的指针
ExpandedBlockEnd.gif
}
AdjList[vnum];
None.gif
None.gif
// 对此图的定义
None.gif
typedef  struct  graph
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    AdjList adjlist;                                    
//头结点    
InBlock.gif
    int vexnum;                                            //结点数
InBlock.gif
    int arcnum;                                            //边数
ExpandedBlockEnd.gif
}
GraphTp;
None.gif
None.gif
// 建立一个新的结点
None.gif
ArcNodeTp  *  CreateNewNode( int  adjvex)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    ArcNodeTp 
* node=(ArcNodeTp *)malloc(sizeof(ArcNodeTp));
InBlock.gif    node
->adjvex=adjvex;
InBlock.gif    node
->nextarc=NULL;
InBlock.gif
InBlock.gif    
return node;
ExpandedBlockEnd.gif}

None.gif
None.gif
// 建立P114的5-10的无向图
None.gif
void  CreateGrapth(GraphTp  &  graph)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    graph.vexnum
=7;
InBlock.gif    graph.arcnum
=8;
InBlock.gif
InBlock.gif    ArcNodeTp 
* p=NULL;
InBlock.gif    
int index=0;
InBlock.gif    
//建立结点
InBlock.gif
    index=0;
InBlock.gif    graph.adjlist[index].vertex
=index;
InBlock.gif    p
=CreateNewNode(1);
InBlock.gif        
//修改头结点
InBlock.gif
    graph.adjlist[index].firstarc=p;
InBlock.gif        
//指向下一个结点
InBlock.gif
    p->nextarc=CreateNewNode(2);
InBlock.gif
InBlock.gif    index
=1;
InBlock.gif    graph.adjlist[index].vertex
=index;
InBlock.gif    p
=CreateNewNode(3);
InBlock.gif    graph.adjlist[index].firstarc
=p;
InBlock.gif    p
->nextarc=CreateNewNode(4);
InBlock.gif
InBlock.gif    index
=2;
InBlock.gif    graph.adjlist[index].vertex
=index;
InBlock.gif    p
=CreateNewNode(5);
InBlock.gif    graph.adjlist[index].firstarc
=p;
InBlock.gif    p
->nextarc=CreateNewNode(6);
InBlock.gif
InBlock.gif    index
=3;
InBlock.gif    graph.adjlist[index].vertex
=index;
InBlock.gif    p
=CreateNewNode(1);
InBlock.gif    graph.adjlist[index].firstarc
=p;
InBlock.gif    p
->nextarc=CreateNewNode(7);
InBlock.gif
InBlock.gif    index
=4;
InBlock.gif    graph.adjlist[index].vertex
=index;
InBlock.gif    p
=CreateNewNode(1);
InBlock.gif    graph.adjlist[index].firstarc
=p;
InBlock.gif    p
->nextarc=CreateNewNode(7);
InBlock.gif
InBlock.gif    index
=5;
InBlock.gif    graph.adjlist[index].vertex
=index;
InBlock.gif    p
=CreateNewNode(2);
InBlock.gif    graph.adjlist[index].firstarc
=p;
InBlock.gif    p
->nextarc=CreateNewNode(6);
InBlock.gif
InBlock.gif    index
=6;
InBlock.gif    graph.adjlist[index].vertex
=index;
InBlock.gif    p
=CreateNewNode(2);
InBlock.gif    graph.adjlist[index].firstarc
=p;
InBlock.gif    p
->nextarc=CreateNewNode(5);
InBlock.gif
InBlock.gif    index
=7;
InBlock.gif    graph.adjlist[index].vertex
=index;
InBlock.gif    p
=CreateNewNode(3);
InBlock.gif    graph.adjlist[index].firstarc
=p;
InBlock.gif    p
->nextarc=CreateNewNode(4);
ExpandedBlockEnd.gif}

None.gif
None.gif
// 深度优先算法
None.gif
void  Dfs(GraphTp graph, int  value, int  visited[])
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    ArcNodeTp 
*p=NULL;
InBlock.gif    cout
<<"访问顶点"<<value<<endl;
InBlock.gif    visited[value]
=1;
InBlock.gif    p
=graph.adjlist[value].firstarc;
InBlock.gif    
while(p!=NULL)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
if (!visited[p->adjvex])
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            Dfs(graph,p
->adjvex,visited);
ExpandedSubBlockEnd.gif        }

InBlock.gif        p
=p->nextarc;
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

None.gif
None.gif
int  main( int  argc,  char *  argv[])
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    
int visited[vnum];
InBlock.gif    
for(int i=0;i<vnum;i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        visited[i]
=0;
ExpandedSubBlockEnd.gif    }

InBlock.gif    GraphTp graph;
InBlock.gif    CreateGrapth(graph);
InBlock.gif    Dfs(graph,
0,visited);
InBlock.gif
InBlock.gif    
return 0;
ExpandedBlockEnd.gif}

None.gif    

转载于:https://www.cnblogs.com/fxwdl/archive/2007/07/28/834473.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值