强连通图缩点——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

tarjan求强连通+缩点——cf1248E

We Need More Bosses CodeForces - 1000E (无向图缩点)

P2860[USACO06JAN]Redundant Paths G(边双连通分量&无向图缩点)

tarjan强连通分量缩点模板