第一关 图的邻接矩阵创建和DFS
任务描述
本关任务:实现基于邻接矩阵的无向图的创建方法,以及深度优先遍历方法
编程要求
输入
多行数据
第一行是无向图的顶点个数和边个数
第二行是顶点信息
第三行开始是每条边依附的顶点信息
输出
从第一个顶点出发的DFS序列
测试说明
平台会对你编写的代码进行测试:
测试输入:
4 5
A B C D
A B
A C
A D
B C
C D
预期输出:
ABCD
#include <iostream>
#include <cstring>
using namespace std;
#define MVNum 100
typedef struct {
char vexs[MVNum];
int arcs[MVNum][MVNum];
int vexnum, arcnum;
} AMGraph;
int LocateVex(AMGraph G, char u) {
int i;
for (i = 0; i < G.vexnum; ++i) {
if (u == G.vexs[i]) {
return i;
}
}
return -1;
}
void CreateUDN(AMGraph &G, int vexnum, int arcnum) {
G.vexnum = vexnum;
G.arcnum = arcnum;
for (int i = 0; i < G.vexnum; ++i) {
cin >> G.vexs[i];
}
memset(G.arcs, 0, sizeof(G.arcs));
char u, v;
for (int i = 0; i < G.arcnum; ++i) {
cin >> u >> v;
int indexU = LocateVex(G, u);
int indexV = LocateVex(G, v);
if (indexU!= -1 && indexV!= -1) {
G.arcs[indexU][indexV] = 1;
G.arcs[indexV][indexU] = 1;
}
}
}
bool visited[MVNum] = { false };
void DFS(AMGraph G, int v) {
cout << G.vexs[v];
visited[v] = true;
for (int i = 0; i < G.vexnum; ++i) {
if (G.arcs[v][i] == 1 &&!visited[i]) {
DFS(G, i);
}
}
}
第二关 图的邻接表创建
任务描述
本关任务:实现基于邻接表的无向图的创建方法
编程要求
输入
多行数据
第一行是无向图的顶点个数和边个数
第二行是顶点信息
第三行开始是每条边依附的顶点信息
输出
从第一个顶点出发的DFS序列
测试说明
平台会对你编写的代码进行测试:
测试输入:
4 5
A B C D
A B
A C
A D
B C
C D
预期输出:
ADCB
#include <iostream>
using namespace std;
#define MVNum 100
typedef struct ArcNode{
int adjvex;
struct ArcNode *nextarc;
}ArcNode;
typedef struct VNode{
char data;
ArcNode *firstarc;
}VNode;
typedef struct ALGraph{
VNode vertices[MVNum];
int vexnum, arcnum;
}ALGraph;
int LocateVex(ALGraph G, char v)
{
for (int i = 0; i < G.vexnum; i++) {
if (G.vertices[i].data == v)
return i;
}
return -1;
}
void insertArcNode(VNode &vnode, int adjvex) {
ArcNode* newArc = new ArcNode;
newArc->adjvex = adjvex;
newArc->nextarc = vnode.firstarc;
vnode.firstarc = newArc;
}
void CreateUDN(ALGraph &G, int vexnum, int arcnum)
{
G.vexnum = vexnum;
G.arcnum = arcnum;
for (int i = 0; i < G.vexnum; i++)
{
cin>>G.vertices[i].data;
G.vertices[i].firstarc = NULL;
}
char vex_one, vex_two;
for (int i = 0; i < G.arcnum; i++) {
cin >> vex_one >> vex_two;
int v1 = LocateVex(G, vex_one);
int v2 = LocateVex(G, vex_two);
insertArcNode(G.vertices[v1], v2);
insertArcNode(G.vertices[v2], v1);
}
}
第三关 K顶点
任务描述
本关任务:在基于邻接矩阵的有向图中寻找k顶点,k顶点即出度大于入度的顶点
编程要求
输入
多行数据
第一行是有向图的顶点个数和弧个数
第二行是顶点信息
第三行开始是每条边依附的顶点信息
输出
所有K顶点的名称,按顶点顺序输出
测试说明
平台会对你编写的代码进行测试:
测试输入:
4 5
A B C D
A B
A D
B C
B D
C D
预期输出:
AB
#include <iostream>
using namespace std;
#define MVNum 100
typedef struct {
char vexs[MVNum];
int arcs[MVNum][MVNum];
int vexnum, arcnum;
}AMGraph;
void printKv(AMGraph G)
{
int outD[100] = {0};
int inD[100] = {0};
for(int i = 0;i < G.vexnum;i++) {
for(int j = 0;j < G.vexnum;j++) {
if(G.arcs[i][j] == 1) {
outD[i]++;
}
}
}
for(int i = 0;i < G.vexnum;i++) {
for(int j = 0;j < G.vexnum;j++) {
if(G.arcs[j][i] == 1) {
inD[i]++;
}
}
}
for(int i = 0;i < G.vexnum;i++) {
if(outD[i] > inD[i]) {
printf("%c",G.vexs[i]);
}
}
}
第四关 有向图路径判断
任务描述
本关任务:在基于邻接表的有向图中,判断顶点i与顶点j之间是否存在路径(i!=j)
编程要求
输入
多行数据
第一行是有向图的顶点个数n和弧个数e
第二行是n个顶点信息
第三行开始,到第e+2行是弧依附的两个顶点信息
第e+3行是要判断是否存在路径的顶点组合个数
第e+4行开始,是顶点名称vi和vj
输出
顶点vi和vj之间是否存在路径
测试说明
平台会对你编写的代码进行测试:
测试输入:
4 4
A B C D
A B
A C
C D
D A
3
A D
D C
B C
"其中,要判断是否存在路径的是AD,DC和BC三组顶点"
预期输出:
Yes
Yes
No
"输出结果表示AD和DC之间存在路径,BC之间不存在路径"
#include <iostream>
using namespace std;
#define MVNum 100
typedef struct ArcNode{
int adjvex;
struct ArcNode *nextarc;
}ArcNode;
typedef struct VNode{
char data;
ArcNode *firstarc;
}VNode;
typedef struct ALGraph{
VNode vertices[MVNum];
int vexnum, arcnum;
}ALGraph;
bool visited[MVNum] = {false};
bool DFS(ALGraph G, int v, int j) {
if (v == j) {
return true;
}
visited[v] = true;
ArcNode *p;
for (p = G.vertices[v].firstarc; p; p = p->nextarc) {
if (!visited[p->adjvex]) {
if (DFS(G, p->adjvex, j)) {
return true;
}
}
}
return false;
}
int validPath(ALGraph G,int i,int j)
{
for (int k = 0; k < G.vexnum; k++) {
visited[k] = false;
}
return DFS(G, i, j)? 1 : 0;
}