图的邻接矩阵实现

 最近在学数据结构,自己实现了下图的邻接矩阵实现,对于邻接表实现方法类似,此处把代码贴上:
//"MyGraph.h"
#include <iostream>
#include <queue>
using namespace std;

typedef char VertexType;	//顶点类型,用户自定义
typedef int EdgeType;		//边上权值类型,用户自定义

#define MAXVEX 100			//最大顶点数,用户自定义
#define INFINITY 65535		//用65535代表无穷大

typedef struct{
	VertexType vex[MAXVEX];		//顶点表
	EdgeType arc[MAXVEX][MAXVEX];	//邻接矩阵,可看做边表
	int numVextexes,numEdges;	//图中当前顶点数和边数
}MGraph;


void CreateMGraph(MGraph* pGraph);	//创建图
void DFS(MGraph G,int i);			//图DFS递归算法
void DFSTraverse(MGraph G);			//图DFS遍历
void BFSTraverse(MGraph G);			//图BFS遍历
<pre name="code" class="cpp">//"MyGraph.cpp"
#include "stdafx.h"
#include "MyGraph.h"

bool visited[MAXVEX];
//建立无向网图的邻接矩阵表示
void CreateMGraph(MGraph* pGraph)
{
	int i,j,k,w;
	printf("输入图的顶点数和边数:\n");
	//scanf("%d,%d",&pGraph->numVextexes,&pGraph->numEdges);
	cin>>pGraph->numVextexes>>pGraph->numEdges;

	for(i = 0; i < pGraph->numVextexes; i++)
		//scanf("%c",&pGraph->vex[i]);
		cin>>pGraph->vex[i];

	for(i = 0; i < pGraph->numVextexes; i++)
		for(j = 0; j < pGraph->numVextexes; j++)
		{
			if(i == j)
				pGraph->arc[i][j] = 0;
			else
			pGraph->arc[i][j] = INFINITY;	//初始化边表
		}
	for(k = 0; k < pGraph->numEdges; k++)
	{
		printf("输入边(Vi,Vj)的下标i,下标j和权w:\n");
		//scanf("%d,%d,%d",&i,&j,&w);
		cin>>i>>j>>w;
		pGraph->arc[i][j] = w;
		pGraph->arc[j][i] = w;	//无向图,矩阵对称
	}

}

//邻接矩阵的深度优先遍历递归算法
void DFS(MGraph G,int i)
{
	int j;
	visited[i] = true;
	printf("%c",G.vex[i]);	//打印此节点
	for(j = 0; j < G.numVextexes; j++)
	{
		if(G.arc[i][j] == 1 && !visited[j])
			DFS(G,j);
	}
}

//邻接矩阵深度优先遍历操作
void DFSTraverse(MGraph G)
{
	int i;
	for(i = 0; i < G.numVextexes; i++)
		visited[i] = false;
	for(i = 0; i < G.numVextexes; i++)
	{
		if(!visited[i])		//对未访问过的点执行DFS,若是连通图,则只执行一次
			DFS(G,i);
	}
}

//邻接矩阵的广度优先遍历算法
void BFSTraverse(MGraph G)
{
	queue<char> myQueue;
	for(int i = 0; i < G.numVextexes;i++)
		visited[i] = false;
	for(int i = 0; i < G.numVextexes; i++)	//对每一个顶点做循环
	{
		if(!visited[i])
		{
			visited[i] = true;
			cout<<G.vex[i];
			myQueue.push(G.vex[i]);	//将此顶点入队列
			while(!myQueue.empty())
			{
				myQueue.pop();//将队头出队
				for(int j = 0; j < G.numVextexes; j++)
					if(G.arc[i][j] == 1 && !visited[j])//判断其他顶点若与当前点存在边且未访问过
					{
						visited[j]=true;
						cout<<G.vex[j];	//打印
						myQueue.push(G.vex[j]);
					}
			}
		}
	}
}

// Graph.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "MyGraph.h"


int _tmain(int argc, _TCHAR* argv[])
{
	MGraph myGraph;
	CreateMGraph(&myGraph);
	DFSTraverse(myGraph);
	BFSTraverse(myGraph);
	return 0;
}


 

         

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值