图采用邻接矩阵存储结构
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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])