zoukankan      html  css  js  c++  java
  • 求强连通分量算法分析-未完成

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

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

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

    下面是我还没校验的代码。。明天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;
    }
  • 相关阅读:
    Centos7创建用户su登录后显示为 bash-4.1$
    winserver 搭建 Citrix License 许可服务器
    Centos7扩展存储空间
    CentOS7配置crate集群
    CentOS7安装cratedb
    初探Vue
    浅谈web攻防
    响应式布局
    JavaScript正则表达式,你真的知道?
    15个关于Chrome的开发必备小技巧[译]
  • 原文地址:https://www.cnblogs.com/linkzijun/p/6064204.html
Copyright © 2011-2022 走看看