寒假第三天总结

寒假第三天总结

晚上有点颓废的一天

上午洛谷春令营,起晚的锅就不提了…
大概讲了线段树及其变种&&扫描线技术&&二维数点&&主席树四部分内容,详细的专开一个blog。
下午开始狂写线段树,写了大概2h(期间连查带改),终于写出了我有生以来第一个线段树!!!
之后有纯写了大概1.7小时,AC了洛谷线段树模板的第二题。
最后也没睡午觉…
晚上助学课因为题没做所以只是随便听了下,之后有回放了下提高组的那个助学课。
听完课就去找主席树的资料了,然而找了一堆没有一个我期望中的板子…GG
然后心态爆炸看不进去…
后来计时打了一下tarjan,用时13min37s,其中多写了一个加入栈的操作,应该不会影响结果,后面比较dfn[j]与low[i]大小中ins[j]==1的条件忘记加了,这个可能会影响结果,其他的…没什么问题了吧…
最后贴上code充数:

//计时敲强连通分量tarjan算法
#include<bits/stdc++.h>
using namespace std;
const int maxn=10001,maxm=50001;
int m,n,belong[maxn],top=0,head[maxn],dfn[maxn],low[maxn],index=0,stap[maxn],stop=0,ins[maxn],f,g,bcnt=0;
struct node
{
    int to,next;
}edge[maxm];
inline void addedge(int x,int y)
{
    edge[++top].to=y;
    edge[top].next=head[x];
    head[x]=top;
    return;
}
inline void tarjan(int i)
{
    int j;
    dfn[i]=low[i]=++index;
    stap[++stop]=i;ins[i]=1;
    for(int k=head[i];k;k=edge[k].next)
    {
        int y=edge[k].to;
        if(!dfn[y])
        {
            tarjan(y);
            if(low[y]<low[i])low[i]=low[y];
        }
        else if(dfn[y]<low[i]&&ins[j])
        {
            low[i]=dfn[y];
        }
    }
    if(dfn[i]==low[i])
    {
        ++bcnt;
        do
        {
            j=stap[stop--];
            ins[j]=0;
            belong[j]=bcnt;
        }while(j!=i);
    }
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)dfn[i]=low[i]=ins[i]=0;
    while(m--)
    {
        scanf("%d%d",&f,&g);
        addedge(f,g);
    }
    for(int i=1;i<=n;i++)
    {
        if(!dfn[i])tarjan(i);
    }
    bcnt++;
    while(bcnt--)
    {
        for(int i=1;i<=n;i++)
            if(belong[i]==bcnt)
            {
                printf("%d ",i);
            }
        printf("\n");
    }
    return 0;
}