「Luogu P2341」[HAOI2006]受欢迎的牛 发表于 2018-08-09 | 字数统计: 352 | 阅读时长 ≈ 2 给定一个有向图,找出与其他点均可达的点的个数。 代码123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103#include<bits/stdc++.h>using namespace std;typedef int ll;struct edge{ ll to,prev;};edge ed[150001],scc[150001];ll sccno,tot,num,top,cnt,nc,ec,ans;ll last[150001],sccLast[150001],dfn[150001],low[150001],ins[150001],belong[150001];ll from[150001],to[150001],size[150001],out[150001];stack<ll>st;inline void addEdge(ll from,ll to){ ed[++tot].to=to; ed[tot].prev=last[from]; last[from]=tot;}inline void addSCC(ll from,ll to){ scc[++tot].to=to; scc[tot].prev=sccLast[from]; sccLast[from]=tot;}inline void tarjan(ll node){ dfn[node]=low[node]=++num; st.push(node),ins[node]=1; ll flag=0,to; for(register int i=last[node];i;i=ed[i].prev) { to=ed[i].to; if(!dfn[to]) { tarjan(to); low[node]=min(low[node],low[to]); } else { if(ins[to]) { low[node]=min(low[node],dfn[to]); } } } if(dfn[node]==low[node]) { cnt++; ll nd; do { nd=st.top(),st.pop(); ins[nd]=0; belong[nd]=cnt; size[cnt]++; } while(node!=nd); }}inline void mergePoint(){ tot=0; for(register int i=0;i<ec;i++) { if(belong[from[i]]!=belong[to[i]]) { addSCC(belong[from[i]],belong[to[i]]); out[belong[from[i]]]++; } }}int main(){ cin>>nc>>ec; for(register int i=0;i<ec;i++) { cin>>from[i]>>to[i]; addEdge(from[i],to[i]); } for(register int i=1;i<=nc;i++) { if(!dfn[i]) { tarjan(i); } } mergePoint(); for(register int i=1;i<=cnt;i++) { if(!out[i]) { ans++; sccno=i; } } if(ans!=1) { cout<<0; } else { cout<<size[sccno]; }} 本文作者: Karry5307 本文链接: http://karry5307.github.io/2018/08/09/「HAOI2006」受欢迎的牛/ 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!