通过测试用例供参考
2、查找知识图谱中的实例知识
知识图谱是一种结构化的语义网络, 用于描述物理世界中的概念及其实例的相关关系。可以把知识图谱看成是一种有向图, 图中的点是概念或实例,图中的边是概念及其实例的相关关系。现定义一种简单的知识图谱:概念:包括父概念及其子概念,通过subClassOf关系关联,父子概念可以有多个层级; 实例:仅和概念之间通过instanceOf关系关联;关系:以三元组的形式表示,三元组是一个以空格为成员间分隔符的字符串.例如"student subClassOf person"表示student是person的子概邻念; “apple instanceOf fruit"表示apple是概念fruit的实例。给定一个知识图谱,请编写-个方法,可以根据-个概念看找其所有的实例。如果-个概念拥有子概念,那么返回的结果需要包含其所有子概念的实例;如果输入的概念没有实例,则返回字符串"empty” (说明:输出字符串文本不需要包含引号)。
给定的图谱满足以下限制:
1、有向图中不存在环路;
2、所有点和关系的定义对大小写敏感;
解答要求
时间限制:CIC++ 1000ms,其他语言:2000ms
内存限制:CIC++ 32MB,其他语言:64MB
输入
输入第1行,表示图谱中关系的数量n,取值范围[1,10000];
从第2行到n+1行,表示图谱中的关系,每一行是一个关系三元组。第n+2行,表示待查找的元节点,是关系三元组中存在的点。
每行字符的长度不超过100.
输出
按字典序升序排列的字符串数组,其内容是概念及其子概念的所有实例。
样例1
输入:
3
student subClassOf personTom instanceOf studentMarry instanceOf personperson
输出:Marry Tom
解释: student是person的子概念,Tom是student的实例,Marry是person的实
例,Marry的字典序小于Tom,所以返回Marry Tom。
样例2
输入:
1
apple instanceOf fruitfruit
输出:
apple
解释: apple是fruit的唯—实例,所以返回apple。
#include <bits/stdc++.h>
using namespace std;
vector<string> split(string str)
{
vector<string> res;
int pos = 0;
int i = 0;
for ( ; i < str.size(); ++i)
{
if (str[i] == ' ')
{
res.push_back(str.substr(pos, i - pos));
pos = i+1;
}
}
res.push_back(str.substr(pos, i - pos));
return res;
}
void fun(vector<vector<string>>& input, string& gn)
{
unordered_map<string, vector<string>> gainian;//以父概念为键 子概念为值
unordered_map<string, vector<string>> shiti;//以概念为键 实体为值
for (int i = 0; i < input.size(); ++i)
{
if (input[i][1] == "subClassOf")//如果是概念 0是子概念 2是父概念
{
gainian[input[i][2]].push_back(input[i][0]);
// cout << "gainian[" << input[i][2] << "] :" << gainian[input[i][2]].back() << endl;
}
else
{
shiti[input[i][2]].push_back(input[i][0]);
// cout << "shiti[" << input[i][2] << "] :" << shiti[input[i][2]].back() << endl;
}
}
if (gainian.find(gn) != gainian.end())//判断是父概念
{
cout << "find....................................................................." << endl;
// cout << "typeof(gainian[gn]): " << typeid(gainian[gn]).name() << endl;
for (auto x : gainian[gn])
{
// cout << "gainian................." << x << endl;
if (shiti.find(x) != shiti.end())
{
for (auto y : shiti[x])
{
// cout << "shiti................." << y << endl;
cout << y << " ";
}
}
}
return;
}
if (shiti.find(gn) != shiti.end())//此概念不是父概念
{
cout << "finddddddddddddd......................................................" << endl;
for (auto y : shiti[gn])
{
cout << y << " ";
}
}
return;
}
int main()
{
int n = 1;
cin >> n;
cin.ignore();//这个换行有用啊
vector<vector<string>> input(0, vector<string>(3));
string str;
for (int i = 0; i < n; i++)
{
getline(cin, str);
input.push_back(split(str));
}
getline(cin, str);
fun(input, str);
return 0;
}