计算单身之王的数目 用map来存关系,在判断的时候要求满足i喜欢b且b不喜欢i即可
#include<iostream>
#include<cstdio>
#include<set>
#include<string>
#include<string.h>
#include<cstring>
#include<vector>
#include<map>
#include<queue>
#include<stack>
#include<cctype>
#include<algorithm>
#include<sstream>
#include<utility>
#include<cmath>
#include<functional>
#define mt(a) memset(a,0,sizeof (a))
#define fl(a,b,c) fill(a,b,c)
#define SWAP(a,b,t) (t=a,a=b,b=t)
#define inf 1000000000+7
using namespace std;
typedef long long ll;
typedef short si;
map<string, bool>graph[30000 + 20];
map<string, si>ma;
void init()
{
for (int i = 0; i < 30000 + 20; i++)
graph[i].clear();
ma.clear();
}
//int getislike(int i,string name)
//{
// for (int j = 0;j<graph[i].size();j++)
// if (graph[i][j] == name)return 1;
// return 0;
//}
int main()
{
int T;
cin >> T;
while (T--)
{
init();
int b, g, q;
scanf("%d %d %d", &b, &g, &q);
int pos = 0;
for (int i = 0; i < b + g; i++)
{
string name; int number;
cin >> name; scanf("%d", &number);
ma[name] = pos++;
int namepos = ma[name];
for (int j = 0; j < number; j++)
{
cin >> name;
graph[namepos][name] = true;
}
}
for (int i = 0; i < q; i++)
{
vector<string>vv;
//vector<si>wholike, liked;
//map<string, int>named;
int newpos = 0;
int mem;
cin >> mem;
for (int j = 0; j < mem; j++)
{
string name;
cin >> name;
vv.push_back(name);
//wholike.push_back(0);
//liked.push_back(0);
//named[name] = newpos++;
}
/*map<string, int>wholike;
map<string, int>liked;*/
int flag;
for (int who = 0; who < vv.size(); who++)
{
int poswho = ma[vv[who]];
flag = 1;
for (int belike = 0; belike < vv.size(); belike++)
{
if (who == belike)continue;
//int likeis = getislike(poswho, vv[belike]);
/*if (likeis){
wholike[vv[who]]++;
liked[vv[belike]]++;
}*/
if (graph[poswho][vv[belike]])
{
int pos6 = ma[vv[belike]];
if (graph[pos6][vv[who]] != 0)
{
flag = 0; break;
}
//int pos1, pos2;
// pos1 = named[vv[who]];
//pos2 = named[vv[belike]];
//wholike[who]++;
//liked[belike]++;
}
else { flag = 0; break; }
}
if (flag)
{
printf("1 ");
cout << vv[who] << endl;
break;
}
}
if (!flag)cout << "0" << endl;
}
printf("\n");
}
return 0;
}