强连通图缩点——cf999E
Posted zsben991126
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了强连通图缩点——cf999E相关的知识,希望对你有一定的参考价值。
问题转换成缩点求度数为0的点的个数,s点所在联通块作额外处理
缩点写的很烂调了一早上。。
#include<bits/stdc++.h> #include<vector> using namespace std; #define maxn 5005 vector<int>G[maxn]; int n,m,s; int low[maxn],dfn[maxn],ind,stk[maxn],top,ins[maxn],c[maxn],cnt; void Tarjan(int x) dfn[x]=low[x]=++ind; stk[++top]=x;ins[x]=1; for(int i=0;i<G[x].size();i++) int y=G[x][i]; if(!dfn[y]) Tarjan(y); low[x]=min(low[x],low[y]); else if(ins[y]) low[x]=min(low[x],low[y]); if(low[x]==dfn[x]) cnt++;int y; do y=stk[top--]; ins[y]=0; c[y]=cnt; while(x!=y); int main() cin>>n>>m>>s; for(int i=1;i<=m;i++) int u,v; cin>>u>>v; G[u].push_back(v); for(int i=1;i<=n;i++) if(!dfn[i]) Tarjan(i); //缩点重建 int in[maxn]=; in[c[s]]++; for(int u=1;u<=n;u++) for(int i=0;i<G[u].size();i++) if(c[u]!=c[G[u][i]]) in[c[G[u][i]]]++; int ans=0; for(int i=1;i<=cnt;i++) if(in[i]==0)ans++; cout<<ans<<‘\n‘;
以上是关于强连通图缩点——cf999E的主要内容,如果未能解决你的问题,请参考以下文章
Reachability from the Capital CodeForces - 999E(强连通分量 缩点 入度为0的点)
[CF999E]Reachability from the Capital
We Need More Bosses CodeForces - 1000E (无向图缩点)