需要注意:
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); } }
dfn也可以作为深度的标志,进行lca时的次序判断
二分图模型
p.s n==1注意 二分图判断用for+bfs
黑白染色:1*2棋盘型,树结构。
【无向图的最大独立数】: 从V个顶点中选出k个顶,使得这k个顶互不相邻。 那么最大的k就是这个图的最大独立数。
【无向图的最大团】: 从V个顶点选出k个顶,使得这k个顶构成一个完全图,即该子图任意两个顶都有直接的边。
【最小路径覆盖(原图不一定是二分图,但必须是有向图,拆点构造二分图)】:在图中找一些路径,使之覆盖了图中的所有顶点,且任何一个顶点有且只有一条路径与之关联。最小路径覆盖 = |V| - 最大匹配数
【最小边覆盖(原图是二分图)】:在图中找一些边,使之覆盖了图中所有顶点,且任何一个顶点有且只有一条边与之关联。最小边覆盖 = 最大独立集 = |V| - 最大匹配数
【最小顶点覆盖】:用最少的点(左右两边集合的点)让每条边都至少和其中一个点关联。
白书中的输出方案