求强连通分量算法分析-未完成

代码思路来自挑战程序设计

学到了一些问题的解决方式,以及编码实现的方案和技巧

理解一个算法,首先要会构造各种类型的数据,还要能手玩出来,这样才能快速懂

下面是我还没校验的代码。。明天A个题试试

#include <iostream>
#include <vector>
// struct node{

// }
// std::vector<node> edge;
const int maxn=1e5+7;
int n,time,V;//time 其实不需要
std::vector<int> edge[maxn];
std::vector<int> redge[maxn];
std::vector<int> vs[maxn];
bool vis[maxn];
int  col[maxn];//染色标记集合
void addEdge(int u,int v){
    edge[u].push_back(v);
    redge[v].push_back(u);
}
void dfs(int v){
    register int i;
    for(i=0;i<edge[v].size();++i){
        if(!vis[edge[v][i]]){
            vis[edge[v][i]]=true;
            dfs(edge[v][i]);
        }
    }
    vs.push_back(v);
}
void rdfs(int v,int color){
    register int i;
    vis[v]=true;
    col[v]=color;
    for(i=0;i<redge[v].size();++i){
        if(!vis[redge[v][i]]){
            vis[redge[v][i]]=true;
            rdfs(redge[v][i],color);
        }
    }
}
int scc(){
    //返回强连通分量的个数
    memset(vis,0,sizeof(vis));
    //先dfs回溯标号
    //V表示最大节点的标号
    register  int i;
    //给所有点标号
    for(i=0;i<V;++i){
        if(!vis[i]) dfs(i);
    }
    memset(vis,0,sizeof(vis));
    int color=0;
    for(i=vs.size()-1;i>=0;--i){
        if(!vis[vs[i]]){
            rdfs(vs[i],color++);
        }
    }
    return color;
}

int main(){
    scanf("%d",&n);
    
    return 0;
}
原文地址:https://www.cnblogs.com/linkzijun/p/6064204.html