1. 程式人生 > >BZOJ 1648 Cow Picnic 奶牛野餐

BZOJ 1648 Cow Picnic 奶牛野餐

logs 奶牛 {} 復雜度 oid struct define log cstring

作為傻逼的我,一開始就想到了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 }

BZOJ 1648 Cow Picnic 奶牛野餐