const int N = 1E4 + 10;
vector<int>g[N];
int low[N];
int dfn[N],dfs_clock;
int sccon[N],cnt;
bool instack[N];
int in[N],out[N];
stack<int>s;
int n,m;
void tarjan(int u,int fa) {
int v;
low[u]=dfn[u]=++dfs_clock;
s.push(u);
instack[u]=true;
for(int i=0; i<g[u].size(); i++) {
v=g[u][i];
if(!dfn[v]) {
tarjan(v,u);
low[u]=min(low[u],low[v]);
} else if(instack[v])
low[u]=min(low[u],dfn[v]);
}
if(low[u]==dfn[u]) {
cnt++;
while(1) {
v=s.top();
s.pop();
instack[v]=false;
sccon[v]=cnt;
if(v==u)
break;
}
}
}
void find(int l,int r) {
memset(low,0,sizeof(low));
memset(dfn,0,sizeof(dfn));
memset(sccon,0,sizeof(sccon));
memset(instack,false,sizeof(instack));
dfs_clock=cnt=0;
for(int i=l; i<=r; i++)
if(!dfn[i])
tarjan(i,-1);
}
void scc() {
int i,j;
for(i=1; i<=cnt; i++)
in[i]=out[i]=0;
for(i=1; i<=n; i++) {
for(j=0; j<g[i].size(); j++) {
int u=sccon[i];
int v=sccon[g[i][j]];
if(u!=v) {
out[u]++;
in[v]++;
}
}
}
}
//缩点完后调用为
/*
find(1,n);
scc();
cnt为总共的点数
*/
scc缩点
最新推荐文章于 2023-12-18 19:45:21 发布