注意理解题目的意思:是求所有人都能到的点的个数,直接以每个人为起点bfs就行了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
#define sf scanf
#define pf printf
using namespace std;
bool vis[1005];
int able[1005];
int q[1005];
vector<int> G[1005];
void unit()
{
memset(G,0,sizeof(G));
memset(able,0,sizeof(able));
for(int i=1;i<=1000;i++)
G[i].clear();
}
void bfs(int st)
{
queue<int> Q;
memset(vis,0,sizeof(vis));
vis[st]=1,able[st]++;
Q.push(st);
while(!Q.empty())
{
int now=Q.front();
Q.pop();
for(int i=0;i<G[now].size();i++)
{
int tmp=G[now][i];
if(!vis[tmp]) able[tmp]++,vis[tmp]=1,Q.push(tmp);
}
}
}
int main()
{
int i,u,v,T,ca=0;
sf("%d",&T);
while(T--)
{
int k,n,m,_max=-1;
sf("%d%d%d",&k,&n,&m);
for(i=1;i<=k;i++)
sf("%d",&q[i]);
unit();
while(m--)
{
sf("%d%d",&u,&v);
G[u].push_back(v);
_max=max(_max,max(u,v));
}
for(i=1;i<=k;i++)
bfs(q[i]);
int ans=0;
for(i=1;i<=_max;i++)
if(able[i]==k) ans++;
pf("Case %d: %d\n",++ca,ans);
}
return 0;
}