这题主要就是要处理这个传递关系,当时做的时候完全没想到用传递闭包(主要是不会)
用的比较麻烦地dfs不过数据有点小当然也过掉了。。
传递闭包和floyd很像
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
typedef pair<string,string>PII;
map<string,int>mp;
int n,m;
string s1,s2,s3,s4,s5;
int cnt;
int g[1010][1010];
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>s1>>s2>>s3>>s4>>s5;
if(!mp[s1])mp[s1]=++cnt;
if(!mp[s5])mp[s5]=++cnt;
int a=mp[s1],b=mp[s5];
g[a][b]=1;
}
for(int k=1;k<=cnt;k++)
for(int i=1;i<=cnt;i++)
for(int j=1;j<=cnt;j++)
if(g[i][k]&&g[k][j])
g[i][j]=1;
for(int i=1;i<=m;i++)
{
cin>>s1>>s2>>s3>>s4>>s5;
int a=mp[s1],b=mp[s5];
if(!a||!b)
cout<<"Pants on Fire"<<endl;
else
{
if(g[a][b]==1)
cout<<"Fact"<<endl;
else if(g[b][a]==1)
cout<<"Alternative Fact"<<endl;
else if(g[a][b]==0)
cout<<"Pants on Fire"<<endl;
}
}
return 0;
}