【网络流与二分图】专题链接
【图论】
完全三部图:图G可被分为三个顶点集,点集内的点相互均没有连边,不同点集的点之间相互均有连边。完全三部图的三元环个数是三点集点数的乘积。
无向无环图就是树。有向无环图DAG方便操作。
有环图可以tarjan缩点。
哈密顿回路(路径):每个点只经过一次的回路,此时显然每条边也只经过一次,是NPC难题。
欧拉回路(一笔画):每条边只经过一次的回路。
【无向图存在欧拉路径】所有点度数均为偶数,或只有两个点的度数是奇数。
【无向图存在欧拉回路】所有点度数均为偶数。
【有向图存在欧拉回路】所有点入度=出度。
欧几里得距离:两个点之间的距离,n维空间中的欧式距离的计算公式为:
曼哈顿距离:两个点在标准坐标系上的绝对轴距总和,在2维空间中的计算公式为:
【最短路】Dijkstra+Heap比SPFA稳得多!
floyd O(n3)
SPFA 虽然理论上界O(nm),但是实际运行效果不错。
SLF优化:设要加入的节点是j,队首元素为i,若dist(j)<dist(i),则将j插入队首,否则插入队尾。
循环队列大小至少开到点数那么大。
bool spfa() { memset(vis,0,sizeof(vis)); memset(d,0x3f,sizeof(d)); int head=0,tail=1;q[0]=S;vis[S]=1;d[S]=0; while(head!=tail) { int x=q[head++];if(head>3000)head=0; for(int i=first[x];i;i=e[i].from) if(d[x]+e[i].w<d[e[i].v]) { int y=e[i].v; d[y]=d[x]+e[i].w; if(!vis[y]) { if(d[y]<d[q[head]]){head--;if(head<0)head=3000;q[head]=y;} else{q[tail++]=y;if(tail>3000)tail=0;} vis[y]=1; } } vis[x]=0; } return d[T]; }