TopoSort

STL 逐个实现一遍。比如stack为啥用deque来实现,而不是其他的容器,
不是vector等等。可以自己手写一遍,就能体验到性能的差距了。

deque是分段数组,分段索引,然后存储,具体实现比较复杂。可以参考
其他STL源码剖析。

一阶正则化和二阶正则化的区别,一界正则化可以处理稀疏性,二届正则化是欧式空间,

当时学的时候,曹旻老师教的n^2, 然后邻接矩阵+静态链表优化复杂度到O(n+e),
但是这个编程不容易实现。

昨晚学神说怎么不做hihocoder,于是赶紧看了一道拓扑排序,基础题了。

之前只会n^2,看到1e5就傻眼了,

然后知道了O(n+e)的方法,用一个入度数组加队列,类似广度优先的算法来做,时间复杂度是O(n+e)

后来炒肉说BFS,我以为是另外一个,然后根据图关系去扩展点,但是写着发现WA了,问了才知道还是根据入度为0的点去扩展的于是乎,就是一种算法。

另外一种基于DFS和栈的算法之前看过geeksforgeeks上有,现在有点忘了。
有时候会忘记clear每个边的数组

cin>>t;
for(int ti=1;ti<=t;ti++)
{
    cin>>n>>m;
    for(int i=1;i<=n;i++) Edge[i].clear();
    for(int i=0;i<m;i++)
    {
        cin>>x>>y;
        Edge[x].push_back(y);
    }
    int InDegree[n+1];
    memset(InDegree, 0, sizeof InDegree);
    for(int i=1;i<=n;i++)
    {
        for(auto e: Edge[i]) InDegree[e]++;
    }
    queue<int> q;
    for(int i=1;i<=n;i++) if(!InDegree[i]) q.push(i);
    int cnt=0;bool ok=1;
    bool v[n+1];
    //memset(v, 0 ,sizeof v);

    while(!q.empty())
    {
        auto cur=q.front();q.pop();cnt++;
        //InDegree[cur]=-1;
        for(auto e: Edge[cur])
        {
            InDegree[e]--;
            if(!InDegree[e]) q.push(e);
        }
        //cout<<cur<<" ";
        //if(v[cur]) {ok=0; break;}
        //v[cur]=1;
        //for(int i=1;i<=n;i++)
    }
    puts( cnt==n ? "Correct" : "Wrong");
}

Posted by richard爱闹 - 5月 25 2015
如需转载,请注明: 本文来自 Richard