http://poj.org/problem?id=3256
有向图,求所有点中,其他点都可以到达的点的个数。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=1005;
int k,n,m;
int cow[maxn];
int head[maxn];
int num=0;
int mark[maxn];
bool vis[maxn];
int ans=0;
struct Edge{
int to,next;
}e[maxn*10];
void add(int from,int to){
e[num].to=to;
e[num].next=head[from];
head[from]=num++;
}
void dfs(int now){
vis[now]=true;
mark[now]++;
for (int i=head[now];i!=-1;i=e[i].next){
int v=e[i].to;
if (!vis[v]){
dfs(v);
}
}
}
int main(){
cin >> k >> n >> m;
for (int i=1;i<=k;i++){
cin >> cow[i];
}
memset(head,-1,sizeof(head));
for (int i=1;i<=m;i++){
int u,v;
cin >> u >> v;
add(u,v);
}
for (int i=1;i<=n;i++){
memset(vis,false,sizeof(vis));
dfs(cow[i]);
}
for (int i=1;i<=n;i++){
if (mark[i]==k) ans++;
}
cout << ans << endl;
}