图论基础及C++实现

一、图的定义和基本术语

大家可以参考https://oi-wiki.org/
我就不多赘述了,定义术语之类的到处都是,这里我主要给出代码吧,图的基本功能的实现。

首先,我们来看看基本功能有哪些
在这里插入图片描述
接下来我们来看看实现的代码。
我采用的是结构体,然后构建的是无向图用邻接矩阵实现。

#include<iostream>
#include<string>
using namespace std;
#define max_  10
//最大顶点数
int visit[max_];
 /*=========================结构定义*/
struct Graph
{
	string vex;
	int arc[max_][max_];
	int vexnum, edgenum;
};
Graph G;
void CreateG(void)	//================建立邻接矩阵
{
	int i, j, a;
	cout << "输入顶点数和边数:" << endl;
	cin >> G.vexnum >> G.edgenum;
	cout << "输入顶点信息" << endl;
	//for (i = 0; i < G.vexnum; i++)  //顶点信息
		cin >> G.vex;
	for (i = 0; i < G.vexnum; i++)
		for (j = 0; j < G.edgenum; j++)
			G.arc[i][j] = 0;        //初始化邻接表
	for (a = 0; a < G.edgenum; a++)
	{
		cout << "输入边的下标i,下标j" << endl;
		cin >> i >> j;
		G.arc[i][j] = 1; G.arc[j][i] = 1;
	}
	for (i = 0; i < G.vexnum; i++)
	{
		for (j = 0; j < G.vexnum; j++)
			cout << G.arc[i][j]<<"  ";
		cout << endl;
	}
}

然后是一些基本的操作功能,可以对照我们上面给出的图。

void Locatevex(char a)//=================查找
{
	int  m = 0;
	while (m<G.vexnum)
	{
		if (a == G.vex[m])
		{
			cout << "该点在第" << m + 1 << "位" << endl; break;
		}
		m++;
	}
	if (m == G.vexnum)
		cout << "该点不存在" << endl;
}
char Getvex(int m)
{
	return G.vex[m];
}
string Putvxe(int a)
{
	string m="value";
	string::iterator it = G.vex.begin();
	for (; *it != ' '; it++)
	{
		if (*it == G.vex[a])
		{
			G.vex.erase(it);
			break;
		}
	}
	G.vex.insert(a, m);
	return G.vex;
}
int Firstadj(int a)
{
	int j = 0;
	for (; j < G.vexnum; j++)
	{
		if (G.arc[a][j] == 1)
			 break;
	}
	if (j == G.vexnum)
		return  NULL;
	else
		return j;
}
int Nextadj(int a)
{
	int i = 0, j = 0;
	for (; i < G.vexnum; i++)//找v的邻接点w
	{
		if (G.arc[a][i] == 1)
		{
			for (; j < G.vexnum; j++)//找w的邻接点
			{
				if (G.arc[j][i] == 1)
					break;
			}
			break;
		}
	}
	if (i != G.vexnum && j != G.vexnum && a != j)
		return j;
	else
		return NULL;
}
void Insertvex()
{
	char a;
	cout << "请输入增加的新顶点" << endl;
	cin >> a;
	G.vex =G.vex + a;
}
void Deletevex()
{
	int v;
	cout << "请输入需要删除的顶点" << endl;
	cin >> v;
	string::iterator it = G.vex.begin();
	for (; *it != '\0'; it++)//删除顶点
	{
		if (*it == G.vex[v])
		{
			G.vex.erase(it);
			break;
		}
	}
	for (int i = 0; i < G.vexnum; i++)//删除相关的弧
	{
		if (G.arc[v][i] == 1)
		{
			G.arc[v][i] = 0; G.arc[i][v] = 0;
		}
	}
}
void Insertarc()
{
	int i, j;
	cout << "请输入需要增添的弧的两个下标" << endl;
	cin >> i >> j;
	G.arc[i][j] = 1; G.arc[j][i] = 1;
}
void Deletearc()
{
	int i, j;
	cout << "请输入需要删除的弧的两个下标" << endl;
	cin >> i >> j;
	G.arc[i][j] = 0; G.arc[j][i] = 0;
}

然后就是我们的深搜广搜

void DFS(int v)
{
	int j;
	visit[v] = 1;
	cout << G.vex[v];
	for (j = 0; j < G.vexnum; j++)
		if (G.arc[v][j] == 1 && !visit[j])
			DFS(j);
}
void DFSTraverse()
{
	int i;
	for (i = 0; i < G.vexnum; i++)//对所有点进行初始化
		visit[i] = 0;
	for (i = 0; i < G.vexnum; i++)
		if (!visit[i])
			DFS(i);
}
void BFS(int v)
{
	int i, j, n = 0,*p;
	int a[max_];
	p = a;
	for (i = 0; i < G.vexnum; i++)
		visit[i] = 0;
	visit[v] = 1;
	a[n++] = v;
	for (i = 0; i < G.vexnum; i++)
	{
		if (*p != '/0')
		{
		    for (j = 0; j < G.vexnum; j++)
			{
				if (G.arc[*p][j] == 1 && !visit[j])
				{
					visit[j] = 1;
					a[n++] = j;
				}
			}
			p++;
		}
	}
	for (n = 0; n < G.vexnum; n++)
		cout << G.vex[a[n]];
}

作为一个菜的不能再菜的菜鸟,希望我能慢慢进步吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值