求助46

P2746 [USACO5.3] 校园网Network of Schools

AC了 ```cpp #include<cstdio> #include<algorithm> #include<vector> #include<cstring> #define N 12505 using namespace std; int head[N],to[N],nxt[N],tot,n,m,rh[N],rt[N],rn[N],cmp[N],cnt,ans,ans1,ind[N],oud[N]; vector<int >out; bool vis[N]; void add(int u,int v){ to[++tot]=v,rt[tot]=u; nxt[tot]=head[u],rn[tot]=rh[v]; head[u]=tot,rh[v]=tot; } void dfs(int x){ vis[x]=1; for(int i=head[x];i;i=nxt[i]){ int y=to[i]; if(!vis[y])dfs(y); } out.push_back(x); } void rd(int x,int ff){ vis[x]=1;cmp[x]=ff; for(int i=rh[x];i;i=rn[i]){ int y=rt[i]; if(!vis[y])rd(y,ff); } } int kosaraju(){ memset(vis,0,sizeof(vis)); out.clear(); for(int i=1;i<=n;i++)if(!vis[i])dfs(i); int f=0; memset(vis,0,sizeof(vis)); for(int i=out.size()-1;i>=0;i--)if(!vis[out[i]])rd(out[i],++f); return f; } signed main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ m=0; scanf("%d",&m); while(m!=0){ add(i,m); scanf("%d",&m); } } cnt=kosaraju(); for(int i=1;i<=n;i++){ for(int j=head[i];j;j=nxt[j]){ int y=to[j]; if(cmp[i]!=cmp[y]){ ind[cmp[y]]++; oud[cmp[i]]++; // printf("%d\n",cmp[i]); } } } for(int i=1;i<=cnt;i++){ if(ind[i]==0)ans++; if(oud[i]==0)ans1++; //printf("%d %d\n",ind[i],oud[i]); } printf("%d\n",ans); if(cnt==1)printf("0"); else printf("%d",max(ans1,ans)); return 0; } ```
by 黑影洞人 @ 2021-10-06 14:41:17


|