码迷,mamicode.com
首页 > Windows程序 > 详细

[CF999E] Reachability from the Capital - 强连通分量

时间:2020-03-28 10:32:11      阅读:77      评论:0      收藏:0      [点我收藏+]

标签:pre   efi   amp   define   c++   cap   ons   name   code   

\(n\) 座城市和 \(m\) 条单向道路,为了能让首都能够到达所有的城市,最少需要新修建多少新的单向道路?

Solution

答案为缩点后的分量图中除 \(S\) 所在分量外入度为 \(0\) 的分量数

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N = 1000005;

namespace scc {
    vector <int> g[N],scc[N];
    int ind,f[N],siz[N],dfn[N],low[N],vis[N],s[N],
        bel[N],top,tot,n,m,d[N];
    void make(int p,int q) {
        g[p].push_back(q);
    }
    void dfs(int p) {
        s[++top]=p;
        dfn[p]=low[p]=++ind;
        for(int i=0;i<g[p].size();i++) {
            int q=g[p][i];
            if(!dfn[q]) dfs(q), low[p]=min(low[p],low[q]);
            else if(!bel[q]) low[p]=min(low[p],dfn[q]);
        }
        if(dfn[p]==low[p]) {
            ++tot;
            for(int i=0;i!=p;) {
                i=s[top--];
                bel[i]=tot;
                scc[tot].push_back(i);
            }
        }
    }
    void solve(int _n) {
        n=_n;
        for(int i=1;i<=n;i++) if(!dfn[i]) dfs(i);
    }
}

using scc::g;
using scc::tot;
using scc::make;
using scc::bel;
int n,m,r,t1,t2,t3,d[N];

signed main() {
    ios::sync_with_stdio(false);
    cin>>n>>m>>r;
    for(int i=1;i<=m;i++) {
        cin>>t1>>t2;
        make(t1,t2);
    }
    scc::solve(n);
    for(int i=1;i<=n;i++) {
        for(int j:g[i]) {
            if(bel[i]!=bel[j]) ++d[bel[j]];
        }
    }
    int ans=0;
    for(int i=1;i<=tot;i++) {
        if(d[i]==0 && bel[r]!=i) ++ans;
    }
    cout<<ans;
}



[CF999E] Reachability from the Capital - 强连通分量

标签:pre   efi   amp   define   c++   cap   ons   name   code   

原文地址:https://www.cnblogs.com/mollnn/p/12585933.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!