codeforces 999E Reachability from the Capital

网友投稿 244 2022-09-16

codeforces 999E Reachability from the Capital

​​ tarjan缩点之后找出所有入度为0的点即可

#includeusing namespace std;inline char gc(){ static char now[1<<16],*S,*T; if (T==S){T=(S=now)+fread(now,1,1<<16,stdin);if (T==S) return EOF;} return *S++;}inline int read(){ int x=0,f=1;char ch=gc(); while(!isdigit(ch)) {if (ch=='-') f=-1;ch=gc();} while(isdigit(ch)) x=x*10+ch-'0',ch=gc(); return x*f;}const int N=5500;struct node{ int x,y,next;}data[N<<1];int dfn[N],low[N],h[N],in[N],n,m,s,b[N],q[N],top,num,S;bool stackf[N];inline void insert1(int x,int y){ data[++num].y=y;data[num].next=h[x];h[x]=num;data[num].x=x;}inline void tarjan(int x){ dfn[x]=low[x]=++num;q[++top]=x;stackf[x]=1; for (int i=h[x];i;i=data[i].next){ int y=data[i].y; if (!dfn[y]) tarjan(y),low[x]=min(low[x],low[y]); else if(stackf[y]) low[x]=min(low[x],dfn[y]); } if (dfn[x]==low[x]){ ++s;int y; do{ y=q[top--];stackf[y]=0;b[y]=s; }while(y!=x); }}int main(){// freopen("e.in","r",stdin); n=read();m=read();S=read(); for (int i=1;i<=m;++i){ int x=read(),y=read(); insert1(x,y); }int nm=num;num=0; for (int i=1;i<=n;++i) if (!dfn[i]) tarjan(i);num=0; for (int i=1;i<=nm;++i){ int x=data[i].x,y=data[i].y; if (b[x]==b[y]) continue; insert1(b[x],b[y]);++in[b[y]]; }int cnt=0; for (int i=1;i<=s;++i) if (!in[i]) if (i!=b[S]) ++cnt; printf("%d\n",cnt); return 0;}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:bzoj1087[SCOI2005]互不侵犯King
下一篇:抖音、快手、视频号的春节战事!
相关文章

 发表评论

暂时没有评论,来抢沙发吧~