Is-A? Has-A? Who Knowz-A?(floyd求关系闭包)

这个题我就想说,为什么用一个数组不行呢?
看了题解用的两个数组才能过,我很懵比;这道题其实可以用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;
}

猜你喜欢

转载自blog.csdn.net/qq_44555205/article/details/104592862

相关文章