图-深度优先广度优先,以及邻接表的创建

将上篇内容改成了C++版本,为了直接使用queue这个容器,只是为了自学而敲的

//#include <stdio.h>
#include <iostream>
#include <string>
#include <queue>
//#include <stdlib.h>

//#include <curses.h>
using namespace std;
typedef char VertexType; //顶点类型用户自定义
typedef int EdgeType;    //边上的权值类型用户自定义

#define MAXVEX 100        //最大顶点数
#define INFINITY 65535    //代表无穷大,用来表示不存在的边的权值为无穷大
#define DEBUG
#define MAXVEX 100
typedef int Boolean;
Boolean visited[MAXVEX];
#define TRUE 1
#define FALSE 0

typedef struct
{
	VertexType vexs[MAXVEX];  //顶点
	EdgeType arc[MAXVEX][MAXVEX];  //邻接矩阵
	int numVertexes, numEdges;     //顶点数,边数
}Graph;
//定位???
int locates(Graph *g, char ch)
{
	int i = 0;
	for(i=0; i<g->numVertexes; i++){
		if(g->vexs[i]==ch){
			break;
		}
	}
	if(i>g->numVertexes){
		return -1;
	}
	return i;
}

void CreatGraph(Graph *g)
{
	int i, j, k, w;
	//printf("input num of vertexs, edges:\n");
	cout<<"input num of vertexs, edges:"<<endl;
	//scanf("%d, %d", &(g->numVertexes), &(g->numEdges));
	cin>>g->numVertexes>>g->numEdges;

	#ifdef DEBUG
	//printf("%d %d\n", g->numVertexes, g->numEdges);
	cout<<g->numVertexes<<' '<<g->numEdges<<endl;
	#endif

	for(i = 0; i <g->numVertexes;i++)
	{
		g->vexs[i] = getchar();
		//没看懂啊
		while(g->vexs[i]=='\n'){
			g->vexs[i] = getchar();
		}
	}

	#ifdef DEBUG
	for(i = 0; i < g->numVertexes; i++){
		//printf("%c ", g->vexs[i]);
        cout<<g->vexs[i]<<' ';
	}
	//printf("\n");
	cout<<endl;
	#endif

	for(i = 0; i <g->numVertexes;i++){
		for(j=0; j<g->numVertexes;j++){
            if(i==j)
                g->arc[i][j]=0;
			g->arc[i][j]=INFINITY; //邻接矩阵初始化为无穷大
		}
	}
	for(k = 0; k<g->numEdges; k++){
		char p,q;
		//printf("input i , j of (vi, vj) and weight:\n");
		cout<<"input i, j of (vi,vj) and weight:"<<endl;
		p =getchar();
		while(p=='\n'){
			p=getchar();
		}
		q=getchar();
		while(q=='\n'){
			q=getchar();
		}
		//scanf("%d",&w);
		cin>>w;
		int m=-1;
		int n=-1;
		m=locates(g,p);
		n=locates(g,q);
		if(m==-1||n==-1)
		{
			fprintf(stderr, "there is no this vertex.\n");
			return ;
		}
		g->arc[m][n]=w;
		//没有以下这句话就是有向图了
		g->arc[n][m]=g->arc[m][n]; //无向图,所以是对称的
	}
}

//打印无向图
void printGraph(Graph *g)
{
	int i , j;
	for(i = 0; i<g->numVertexes;i++){
		for(j=0; j<g->numVertexes;j++){
			//printf("%10d ",g->arc[i][j]);
			cout<<g->arc[i][j]<<'          ';
		}
		//printf("\n");
		cout<<endl;
	}
}
//邻接矩阵的深度优先算法
void DFS(Graph *g, int i)
{
	int j;
	visited[i] =TRUE;
	//printf("%c ", g->vexs[i]);
	cout<<g->vexs[i]<<endl;
	for(j = 0; j < g->numVertexes; j++){
		//已经确定没有关系的两定点之间权值用无限大表示
		if(g->arc[i][j]!=65535&&!visited[j]){
			DFS(g,j);
		}
	}
}

//邻接矩阵的深度遍历操作
void DFSTraverse(Graph *g)
{
	int i;
	for(i = 0; i<g->numVertexes;i++){
		visited[i]=FALSE;
	}
	for(i = 0; i<g->numVertexes;i++){
		if(!visited[i]){
			DFS(g,i);
		}
	}
}
void BFSTraverse(Graph *g)
{
	int i,j;
	queue<char> q;
	for(i = 0; i<g->numVertexes;i++){
		visited[i]=FALSE;//初始化

	}
	//InitQueue(&q);
	for(i=0;i<g->numVertexes;i++){
		if(!visited[i]){
			visited[i]=TRUE;
			//printf("%c ",g->vexs[i]);
			cout<<g->vexs[i]<<endl;
			//EnQueue(&q,i);
			q.push(i);
			//while(!QueueEmpty(q)){
			while(!q.empty()){
				int m;
				//Dequeue(&q,&m);
				m=q.front();
				q.pop();
				for(j=0;j<g->numVertexes;j++){
					if(g->arc[m][j]!=65535&&!visited[j]){
						visited[j]=TRUE;
						//printf("%c ",g->vexs[j]);
						cout<<g->vexs[j]<<endl;
						//Enqueue(&q,j);
						q.push(j);
					}
				}
			}
		}
	}
}
int main(int argc, char ** argv)
{
	Graph g;
	CreatGraph(&g);
    /*g.numVertexes = 5;
    g.numEdges=6;
    g.vexs[0]=0;
    g.vexs[1]=1;
    g.vexs[2]=2;
    g.vexs[3]=3;
    g.vexs[4]=4;
	g.vexs[5]={'0'};
	g.arc[5][5] = {65535};
	//g.arc[5][5]={65535,65535,65535,65535,6,9,65535,3,65535,65535,2,65535,65535,5,65535,65535,65535,65535,65535,1};
	*/
	cout<<"DFS:"<<endl;
	DFSTraverse(&g);
	//printf("\n");
	cout<<endl;
	cout<<"BFS:"<<endl;
	BFSTraverse(&g);
	//printGraph(&g);
	return 0;
}


这是在网上找的一个示例图,接下来我们的输入按照这个来进行,下图是运行结果



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值