竟然把n当成种类数???
所以首先排除了floyd
鲨鱼喝🍵.jpg
- is→is= is
- has→has=has
- has→is=has
- is→has=has
也始终不理解为什么关系会这样传递,untill看到
A 是 B 的子类叫 A is B
A 是 B 的属性之一叫 B has A
#include <bits/stdc++.h>
using namespace std;
map<string, int> mp;
int n, m, num=0, ncase;
string s1, s2, s3;
int is[505][505], has[505][505];
void mark(string s) {
if (!mp[s]) mp[s] = ++num;
}
void Floyd1() {
for (int k = 1; k <= num; k++)
for (int i = 1; i <= num; i++)
for (int j = 1; j <= num; j++) {
if (is[i][k] && is[k][j]) is[i][j] = 1;
}
}
void Floyd2() {
for (int k = 1; k <= num; k++)
for (int i = 1; i <= num; i++)
for (int j = 1; j <= num; j++) {
if (has[i][k] && has[k][j]) {
has[i][j] = 1;
} else if (has[i][k] && is[k][j]) {
has[i][j] = 1;
} else if (is[i][k] && has[k][j]) {
has[i][j] = 1;
}
}
}
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> s1 >> s2 >> s3;
mark(s1), mark(s3);
if (s2[0] == 'i') {
is[mp[s1]][mp[s3]] = 1;
} else if (s2[0] == 'h') {
has[mp[s1]][mp[s3]] = 1;
}
}
for (int i = 1; i <= num; i++) {
is[i][i] = 1;
}
Floyd1();
Floyd2();
for (int i = 1; i <= m; i++) {
cin >> s1 >> s2 >> s3;
if (s2[0] == 'i') {
cout << "Query " << ++ncase << ": "
<< (is[mp[s1]][mp[s3]] ? "true" : "false") << endl;
} else if (s2[0] == 'h') {
cout << "Query " << ++ncase << ": "
<< (has[mp[s1]][mp[s3]] ? "true" : "false") << endl;
}
}
}