模板

需要注意:

  strlen() 时间很快然而不是o(1),不要偷懒!

  树状数组要判0

  n=100000 质数个数9592 u[i]!=0个数60794  每个数的u[i]非0个数 778581   约数个数1166750

  n=1000000 质数个数78498 u[i]!=0个数607926 每个数的u[i]非0个数:9185685  约数个数13970034

  数据要保证全部读进来,不要中途break或者return

模板,bitset,sap,zkw,fft,ntt,点分支,斯坦纳树

二分图概念整理 

tarjan

双联通

void tarjan(int x)
{
    dfn[x]=low[x]=++tsum;
    int son=0;
    repedge(i,x) {
        if (use[i]) continue;
        use[i]=use[i^1]=1;
        int too=e[i].t;
        if (!dfn[too]) {
            tarjan(too);
            low[x]=min(low[x],low[too]);
            if (dfn[x]<low[too]) {
                ans++;
                cur[i]=cur[i^1]=1;
            }
        }
        else
            low[x]=min(low[x],dfn[too]);
    }
}

强连通

void tarjan(int x)
{
    dfn[x]=low[x]=++tsum;
    vis[x]=1;
    pp.push(x);
    repedge(i,x) {
        int too=e[i].t;
        if (!dfn[too]) {
            tarjan(too);
            low[x]=low[too]<low[x]?low[too]:low[x];
        }
        else
            if (vis[too] && dfn[too]<low[x]) low[x]=dfn[too];
    }
    if (low[x]==dfn[x]) {
        ++tot;
        numi[tot]=numo[tot]=0;
        int j;
        do {
            j=pp.top();pp.pop();
            vis[j]=0;
            scc[j]=tot;
        }while (j!=x);
    }
}
View Code

 dfn也可以作为深度的标志,进行lca时的次序判断

二分图模型

p.s  n==1注意 二分图判断用for+bfs

黑白染色:1*2棋盘型,树结构。

【无向图的最大独立数】: 从V个顶点中选出k个顶,使得这k个顶互不相邻。 那么最大的k就是这个图的最大独立数。
【无向图的最大团】: 从V个顶点选出k个顶,使得这k个顶构成一个完全图,即该子图任意两个顶都有直接的边。
【最小路径覆盖(原图不一定是二分图,但必须是有向图,拆点构造二分图)】:在图中找一些路径,使之覆盖了图中的所有顶点,且任何一个顶点有且只有一条路径与之关联。最小路径覆盖 = |V| - 最大匹配数
【最小边覆盖(原图是二分图)】:在图中找一些边,使之覆盖了图中所有顶点,且任何一个顶点有且只有一条边与之关联。最小边覆盖 = 最大独立集 = |V| - 最大匹配数
【最小顶点覆盖】:用最少的点(左右两边集合的点)让每条边都至少和其中一个点关联。

 白书中的输出方案

原文地址:https://www.cnblogs.com/Macaulish/p/7404197.html