题意:给定了一个有向图。然后给了一系列的操作,这些操作是去图中的某些点,并且保留这些点之间的边,构成个新图,然后找这个图中入度为0,初读为所有点个数的点。
做法:唉,过了很久才发现这样的点最多一个,细想啊。。。还有VC6.0真是可恶的东西...
#pragma warning(disable:4786)
#include<cstdio>
#include<cstring>
#include<string>
#include<utility>
#include<algorithm>
#include<map>
#include<vector>
using namespace std;
const int LMT=60002;
vector<int>gra[LMT];
map<string,int>nm;
vector<int>par;
string nm2[LMT];
int ans,cnt;
//只有一个KING啊!!!!
void init(void)
{
par.clear();
}
int main()
{
int i,j,T,n,m,q,num,u,v;
char na[25];
string name;
scanf("%d",&T);
while(T--)
{
nm.clear();cnt=0;
for(i=0;i<LMT;i++)gra[i].clear();
scanf("%d%d%d",&n,&m,&q);
for(i=0;i<n;i++)
{
scanf("%s",na);
name=string(na);
if(nm.find(name)==nm.end())
{
nm.insert(make_pair(name,cnt));
nm2[cnt]=name;
cnt++;
}
u=nm[name];
scanf("%d",&num);
for(j=0;j<num;j++)
{
scanf("%s",na);
name=string(na);
if(nm.find(name)==nm.end())
{
nm.insert(make_pair(name,cnt));
nm2[cnt]=name;
cnt++;
}
v=nm[name];
gra[u].push_back(v);
}
sort(gra[u].begin(),gra[u].end());
}
for(i=0;i<m;i++)
{
scanf("%s",na);
name=string(na);
if(nm.find(name)==nm.end())
{
nm.insert(make_pair(name,cnt));
nm2[cnt]=name;
cnt++;
}
u=nm[name];
scanf("%d",&num);
for(j=0;j<num;j++)
{
scanf("%s",na);
name=string(na);
if(nm.find(name)==nm.end())
{
nm.insert(make_pair(name,cnt));
nm2[cnt]=name;
cnt++;
}
v=nm[name];
gra[u].push_back(v);
}
sort(gra[u].begin(),gra[u].end());
}
while(q--)
{
init();
scanf("%d",&num);
while(num--)
{
scanf("%s",na);
name=string(na);
par.push_back(nm[name]);
}
for(i=0;i<(int)par.size();i++)
{
for(j=0;j<(int)par.size();j++)
{
if(i==j)continue;
if(!binary_search(gra[par[i]].begin(),gra[par[i]].end(),par[j])
||binary_search(gra[par[j]].begin(),gra[par[j]].end(),par[i]))
break;
}
if(j==(int)par.size())
{
printf("1 %s\n",nm2[par[i]].c_str());
break;
}
}
if(i==(int)par.size())puts("0");
}
printf("\n");
}
return 0;
}