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;
    }
  • 相关阅读:
    泛型总结
    Java多线程(学习篇)
    Java线程:总结
    Java线程:线程交互
    Java线程:线程安全类和Callable与Future(有返回值的线程)
    Java线程:条件变量、原子量、线程池等
    Java线程:堵塞队列与堵塞栈
    Java线程:锁
    poj 1679 The Unique MST(唯一的最小生成树)
    poj 1659 Frogs' Neighborhood (DFS)
  • 原文地址:https://www.cnblogs.com/linkzijun/p/6064204.html
Copyright © 2011-2022 走看看