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");
}