这个题我就想说,为什么用一个数组不行呢?
看了题解用的两个数组才能过,我很懵比;这道题其实可以用warshall算法求解,但是我到现在也没搞懂为什么用一个数组不能解决?不是一样的求关系闭包吗?
难道是对同一种关系只能用1种数组?
这道题需要注意的就是必须先求is,因为有了is之后才好判断has
AC代码:
#include<bits/stdc++.h>
using namespace std;
map<string,int> mp;
struct Node{
string s,mid,e;
}p[10050];
int is[550][550],has[550][550];
int main(){
int n,m;
scanf("%d%d",&n,&m);
int num=1;
for(int i=0;i<n;i++){
cin>>p[i].s>>p[i].mid>>p[i].e;
if(!mp[p[i].s])mp[p[i].s]=num++;
if(!mp[p[i].e])mp[p[i].e]=num++;
if(p[i].mid=="is-a")is[mp[p[i].s]][mp[p[i].e]]=1;
else if(p[i].mid=="has-a")has[mp[p[i].s]][mp[p[i].e]]=1;
}
for(int i=1;i<num;i++)is[i][i]=1;
for(int k=1;k<num;k++){
for(int i=1;i<num;i++){
if(is[i][k]==1)
for(int j=1;j<num;j++){
if(is[k][j]==1){
is[i][j]=1;
}
}
}
}
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]==1&&has[k][j]==1){
has[i][j]=1;
}
if(has[i][k]==1&&is[k][j]==1){
has[i][j]=1;
}
if(is[i][k]==1&&has[k][j]==1){
has[i][j]=1;
}
}
}
}
for(int i=0;i<m;i++){
cin>>p[i].s>>p[i].mid>>p[i].e;
if(p[i].mid=="is-a"){
if(is[mp[p[i].s]][mp[p[i].e]]==1)printf("Query %d: true\n",i+1);
else printf("Query %d: false\n",i+1);
}else if(p[i].mid=="has-a"){
if(has[mp[p[i].s]][mp[p[i].e]]==1)printf("Query %d: true\n",i+1);
else printf("Query %d: false\n",i+1);
}
}
return 0;
}