一、图的定义和基本术语
大家可以参考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]];
}
作为一个菜的不能再菜的菜鸟,希望我能慢慢进步吧。