**任务描述
基于构建的中医食疗知识图谱,输入一个证机概要,使用 DFS 算法遍历知识图谱,输出从证机概要出发的包含疾病、推荐食材、食谱的基于路径的多跳问答序列。
编程要求
输入
证机概要
输出
包含疾病、推荐食材、食谱的基于路径的多跳问答序列
测试说明
平台会对你编写的代码进行测试:
测试输入:
脾胃失和
预期输出:
脾胃失和->郁证->紫菜->仙人掌紫菜降压汤
脾胃失和->郁证->紫菜->紫菜蛋皮卷
脾胃失和->郁证->紫菜->鱼丝紫菜粥
脾胃失和->郁证->芝麻->芝麻丸
脾胃失和->郁证->芝麻->芝麻聪脑汤
脾胃失和->郁证->芝麻->芝麻首乌杞子丸
脾胃失和->郁证->芝麻->百合芝麻煲猪心
脾胃失和->郁证->芝麻->核桃芝麻扁豆泥
脾胃失和->郁证->芝麻->香卤什锦蔬菜
脾胃失和->郁证->羊肝
脾胃失和->郁证->杏仁
脾胃失和->郁证->薤白
脾胃失和->郁证->小麦
脾胃失和->郁证->香橼
脾胃失和->郁证->香附
脾胃失和->郁证->酸枣仁
脾胃失和->郁证->山楂
脾胃失和->郁证->青皮
脾胃失和->郁证->芹菜->蜂蜜芹菜汁
脾胃失和->郁证->芹菜->芹菜橘皮
脾胃失和->郁证->芹菜->花生仁拌芹菜
脾胃失和->郁证->芹菜->芹菜苹果汁
脾胃失和->郁证->芹菜->热饮芹菜汁
脾胃失和->郁证->苹果->藿香苹果茶
脾胃失和->郁证->苹果->苹果蜂蜜饮
脾胃失和->郁证->苹果->猪心苹果卷
脾胃失和->郁证->苹果->苹果甜椒拼盘
脾胃失和->郁证->牛奶
脾胃失和->郁证->玫瑰花
脾胃失和->郁证->玫瑰
脾胃失和->郁证->绿萼梅
脾胃失和->郁证->萝卜->白萝卜炖蜂蜜
脾胃失和->郁证->萝卜->萝卜酸梅汤
脾胃失和->郁证->萝卜->双银汤
脾胃失和->郁证->萝卜->白萝卜煲羊脯
脾胃失和->郁证->龙眼
脾胃失和->郁证->莲子->莲子心甘草茶
脾胃失和->郁证->莲子->菱角莲子红枣羹
脾胃失和->郁证->莲子->山药参枣糯米粥
脾胃失和->郁证->莲子->冬瓜莲子粥
脾胃失和->郁证->莲藕->鲜藕饮
脾胃失和->郁证->莲藕->五样同饮
脾胃失和->郁证->莲藕->藕圆
脾胃失和->郁证->莲藕->莲藕甘蔗汁
脾胃失和->郁证->荔枝->荔枝枣糖
脾胃失和->郁证->荔枝->人参荔枝酒
脾胃失和->郁证->荔枝->荔枝山药莲米粥
脾胃失和->郁证->荔枝->**
#include <bits/stdc++.h>
#define MVNum 10000
using namespace std;
string Relationship[] = {"有功效","有食谱","有推荐食材","有证机概要"};
typedef struct ArcNode {
int adjvex; // 该边所指向顶点的位置
int relationship; // 表示边的类型,即关系的类型,对应为数组下标
struct ArcNode* nextarc; // 下一条边
} ArcNode; // 边结点
string Entity[]= {"食材","疾病","功效","食谱","证机概要"};
typedef struct VNode {
int entity; // 表示顶点的类型,即实体的类型,对应为数组下标
string info; // 表示顶点的内容,即实体的内容
ArcNode* firstarc; // 指向第一条依附该顶点的边的指针
} VNode, AdjList[MVNum];
typedef struct {
AdjList vertices; // 邻接表
int vexnum, arcnum; // 图的当前顶点数和边数
} ALGraph;
int LocateVex(ALGraph& G, string str) {
// 返回str在AdjList中的位置
for (int i = 0; i < G.vexnum; i++) {
if (G.vertices[i].info == str) {
return i;
}
}
return -1; // 如果找不到,返回 -1 表示错误
}
int LocateEntity(string str) {
// 返回str在Entity数组中的位置
for (int i = 0; i < sizeof(Entity) / sizeof(Entity[0]); i++) {
if (Entity[i] == str) {
return i;
}
}
return -1; // 如果找不到,返回 -1 表示错误
}
int LocateRelationship(string str) {
// 返回str在Relationship数组中的位置
for (int i = 0; i < sizeof(Relationship) / sizeof(Relationship[0]); i++) {
if (Relationship[i] == str) {
return i;
}
}
return -1; // 如果找不到,返回 -1 表示错误
}
void InitALGraph(ALGraph& G) {
// 初始化邻接表
G.vexnum = 0;
G.arcnum = 0;
for (int i = 0; i < MVNum; i++) {
G.vertices[i].entity = -1; // 初始化顶点的类型为 -1,表示错误
G.vertices[i].info = ""; // 初始化顶点的内容为空字符串
G.vertices[i].firstarc = nullptr; // 初始化顶点的边指针为空
}
}
void CreateAdjList(ALGraph& G, string filename) {
// 从filename中按顺序读取实体存入邻接表
ifstream infile(filename);
if (!infile) {
perror("Load");
exit(0);
}
string s1,s2;
while (infile >> s1>>s2) {
G.vertices[G.vexnum].info = s1;
G.vertices[G.vexnum].entity = LocateEntity(s2);
G.vertices[G.vexnum++].firstarc = NULL;
}
infile.close();
}
void CreateUDG(ALGraph& G, string filename) {
// 从filename中按顺序三元组存入邻接表
ifstream file(filename);
if (!file) {
perror("Load");
exit(0);
}
string s1, s2, s3;
while (file >> s1 >> s2 >> s3) {
int i = LocateVex(G, s1);
int j = LocateVex(G, s3);
ArcNode *p1 = new ArcNode;
p1->adjvex = j;
p1->relationship = LocateRelationship(s2);
p1->nextarc = G.vertices[i].firstarc;
G.vertices[i].firstarc = p1;
ArcNode* p2 = new ArcNode;
p2->adjvex = i;
p2->relationship = LocateRelationship(s2);
p2->nextarc = G.vertices[j].firstarc;
G.vertices[j].firstarc = p2;
}
file.close();
}
void DFS(ALGraph& G, int i, bool visited[], string path) {
// 深度优先搜索多跳问答路径,i为输入的证机概要在AdjList中的下标,path为问答路径
// 函数可增加额外的参数
}
void QuestionAnswering(ALGraph& G, string symptom) {
// 调用DFS函数,遍历图G,输出问答序列,symptom为证机概要
}
int main() {
ALGraph G;
InitALGraph(G);
CreateAdjList(G, "/data/workspace/myshixun/3.1.1-基于路径推理的知识图谱多跳问答/entity.txt");
CreateUDG(G, "/data/workspace/myshixun/3.1.1-基于路径推理的知识图谱多跳问答/relationship.txt");
string symptom;
cin >> symptom;
QuestionAnswering(G, symptom);
return 0;
}