bzoj1648: [Usaco2006 Dec]Cow Picnic 奶牛野餐

    xiaoxiao2021-03-25  163

    分析:直接k次dfs,设一个cnt[i]表示第i个点被经过的次数,那么明显,cnt[i]=k时这个点是可以的。。

    #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #define fo(i,a,b) for(int i=a;i<=b;i++) #define fd(i,a,b) for(int i=a;i>=b;i--) using namespace std; int n,m; const int N=1e5+5; int tot,head[N],next[N],go[N],d[N],bz[N],k; inline void add(int x,int y) { go[++tot]=y; next[tot]=head[x]; head[x]=tot; } int vis[1005]; int cnt[N]; inline void dfs(int x) { vis[x]=1; cnt[x]++; int i=head[x]; while (i) { int v=go[i]; if (!vis[v]) { dfs(v); } i=next[i]; } } int main() { scanf("%d%d%d",&k,&n,&m); memset(bz,0,sizeof(bz)); fo(i,1,k)scanf("%d",&d[i]),bz[d[i]]=1; fo(i,1,m) { int x,y; scanf("%d%d",&x,&y); add(x,y); } int ans=0; fo(i,1,k) { memset(vis,0,sizeof(vis)); dfs(d[i]); //if (cnt==k-1)ans++; } fo(i,1,n) if (cnt[i]==k)ans++; printf("%d\n",ans); return 0; }
    转载请注明原文地址: https://ju.6miu.com/read-5269.html

    最新回复(0)