图采用邻接矩阵存储结构

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

图采用邻接矩阵存储结构

#define TRUE 1

#define FALSE 0

#define MAXV 20

typedef int V ertexType; //用顶点编号表示顶点

typedef struct { // 图的定义

int edges[MAXV][MAXV] ; // 边数组

int n, e; //顶点数,弧数

V ertexType vexs[MAXV]; // 顶点信息

} MGraph;

1、创建具有n个顶点e条边的无向图

void CreateUDG(MGraph &G,int n,int e)

{

int i,j,u,v;

G.n=n;G.e=e;

/*

printf("请输入%d个顶点的编号:\n",n);

for(i=0;i

scanf("%d",&G.vexs[i]);

*/

//初始化顶点信息,假设顶点的编号和顶点在数组内的下标相同

for(i=0;i

G.vexs[i]=i;

//初始化邻接矩阵

for(i=0;i

for(j=0;j

G.edges[i][j]=0;

for(j=0;j

{

printf("请输入一条边的两个顶点编号:");

scanf("%d%d",&u,&v);

G.edges[u][v]=G.edges[v][u]=1;

}

}

2、创建具有n个顶点e条弧的有向图

void CreateDG(MGraph &G,int n,int e)

{

int i,j,u,v;

G.n=n;G.e=e;

/*

printf("请输入%d个顶点的编号:\n",n);

for(i=0;i

scanf("%d",&G.vexs[i]);

*/

//初始化顶点信息,假设顶点的编号和顶点在数组内的下标相同

for(i=0;i

G.vexs[i]=i;

//初始化邻接矩阵

for(i=0;i

for(j=0;j

G.edges[i][j]=0;

for(j=0;j

{

printf("请输入一条弧的两个顶点编号(注意先输入的为弧尾):"); scanf("%d%d",&u,&v);

G.edges[u][v]=1;

}

}

3、求图G中顶点v的第一个邻接点

int FirstAdjV ex(MGraph G, int v)

{

for(int i=0;i

if(G.edges[v][i]==1)

return i;

return -1;

}

4、求图G中顶点v相对于w的下一个邻接点

int NextAdjV ex(MGraph G, int v,int w)

{

for(int i=w;i

if(G.edges[v][i]==1)

return i;

return -1;

}

5、深度优先搜索算法

Boolean visited[MAXV];

void DFSTravse (MGraph G)

{

// 对图 G 作深度优先遍历。

for (v=0; v

visited[v] = FALSE; // 访问标志数组初始化

for (v=0; v

if (!visited[v]) DFS(G, v);

// 对尚未访问的顶点调用DFS

}

void DFS(MGraph G, int v) {

// 从顶点v出发,深度优先搜索遍历连通图 G

visited[v] = TRUE; printf(v);

for(int w=FirstAdjV ex(G, v);

w>=0; w=NextAdjV ex(G,v,w))

if (!visited[w]) DFS(G, w);

// 对v的尚未访问的邻接顶点w

// 递归调用DFS

} // DFS

6、广度优先搜索算法

void BFSTraverse(MGraph G)

{

for (v=0; v

visited[v] = FALSE; //初始化访问标志

InitQueue(Q); // 置空的辅助队列Q

for ( v=0; v

if ( !visited[v])

{ // v 尚未访问

visited[v] = TRUE; printf(v); // 访问v

EnQueue(Q, v); // v入队列

while (!QueueEmpty(Q))

{

DeQueue(Q, u); // 队头元素出队并置为u

for(w=FirstAdjV ex(G, u); w>=0; w=NextAdjV ex(G,u,w)) if ( ! visited[w])

相关文档
最新文档