作为傻逼的我,一开始就想到了DFS的正解。但是看了看数据范围 DFS的时间复杂度是(K+E)*NoW K是点 E是边 NOW是奶牛数量
掂量了下 觉得过不去,苦思冥想之后。看了下题解,卧槽这么简单吗? 发现自己看错了,把K+E 看成了K*E,惭愧惭愧~
1 #include <cstdio> 2 #include <algorithm> 3 #include <cstring> 4 5 #define up(a,b,c) for(int c = a;c<=b;++c) 6 #define mem(a,b) memset(a,b,sizeof(a)) 7 8 struct node{ 9 int u,v,next; 10 node(){} 11 node(int _u,int _v,int _next){ 12 u = _u; 13 v = _v; 14 next = _next; 15 } 16 }Edge[10005]; 17 18 int k,now[233],n,m,Count,head[10005]; 19 int ans[1005],tot; 20 bool vis[1005]; 21 22 void dfs(int x){ 23 vis[x]=1; 24 ans[x]++; 25 for(int i=head[x];i;i=Edge[i].next){ 26 if(!vis[Edge[i].v]) dfs(Edge[i].v); 27 } 28 } 29 30 int main(){ 31 scanf("%d%d%d",&k,&n,&m); 32 up(1,k,i) scanf("%d",&now[i]); 33 up(1,m,i) { 34 int x,y; 35 scanf("%d%d",&x,&y); 36 Edge[Count]=node(x,y,head[x]); 37 head[x] = Count++; 38 } 39 up(1,k,i){ 40 mem(vis,0); 41 dfs(now[i]); 42 } 43 up(1,n,i){ 44 if(ans[i]==k) tot++; 45 } 46 printf("%d\n",tot); 47 return 0; 48 }