zoukankan      html  css  js  c++  java
  • 20201013 day34 复习7:拓扑排序、查分约束、欧拉回路

    拓扑排序

    (operatorname{DAG}):有向无环图
    一个工程被分割成了很多个部分,有一些部分要求前面的某些部分完成后才可以开始进行。有些部分则可以同时进行。有些部分则可以同时进行。我们把每个部分看成一个节点,刚刚这些限制看成是边。这样的图是一个DAG,求出这个工程的工作序列,叫做“拓扑排序”。

    求出拓扑排序的方法

    1. 选择一个入度为0的节点并直接输出。
    2. 删除这个节点以及与他关联的所有边。
    3. 重复步骤1,2,直到找不到入度为0的节点。

    通常情况下,在实现的时候会维护一个队列以及每个节点的入度。在删除边的时候顺便把相应节点的入度减去,当这个节点入度为0的时候直接将其加入队列。

    void topo(){
    	int i,j,now;
    	queue<int> q;
    	for(int i=1;i<=n;i++) if(!ind[i]) q.push(i);
    	while(!q.empty()){
    		now=q.front();q.pop();
    		ans[++cnt]=now;
    		for(i=head[now];i;i=e[i].next){
    			ind[e[i].to]--;
    			if(!ind[e[i].to]) q.push(e[i].to);
    		}
    	}
    	if(cnt!=n) printf("-1");
    	else for(int i=1;i<=n;i++) printf("%d ",ans[i]);
    }
    

    例题:混合图

    problem

    (n)(m)边,(a)条有向边,(b)条无向边((m=a+b))。为(b)条无向边确定一个方向,使其不存在环。不用考虑无解。

    solution

    要求最后是个DAG,DAG进行拓扑排序后边的方向都是拓扑序小的连向拓扑序大的。先忽略无向边,对图进行拓扑排序。最后无向边的方向就是拓扑序小的连向拓扑序大的。

    欧拉回路

    存在欧拉路&欧拉回路的条件

    欧拉路:图存在一笔画,则一笔画的路径叫做欧拉路。
    欧拉回路:欧拉路回到了起点,叫做欧拉回路。
    存在欧拉回路叫做欧拉图。存在欧拉路径但不存在欧拉回路的图叫做半欧拉图。
    存在欧拉路的条件:图联通,且有且只有两个奇点。
    存在欧拉回路的条件:图联通,没有奇点。

    如果寻找欧拉回路,对任意一个点dfs,寻找欧拉路则对一个入度为1的点dfs,时间复杂度(O(m+n))

    Hierholzer算法

    步骤:

    1. 判断奇点数(V)(V=0)则任意指定起点。(V=2)则指定起点为奇点。
    2. 递归函数(H(x))
      循环寻找与(x)相连的边((x,u)):{删除((x,u),(u,x));(H(u))}
      (x)放入答案队列中
    void euler(int u){
    	for(int i=bg;i<=ed;i++){
    		if(m[u][i]>=1){
    			m[u][i]--;m[i][u]--;euler(i);
    		}
    	}
    	ans[++anssize]=u;
    }
    

    有向图中欧拉图的判断条件

    1. 所有的点联通
    2. 欧拉回路中所有点的入度和出度一样
    3. 欧拉通路中所有点的入度-出度=1,起点的出度-入度=1,其余点的入度=出度

    例题:[HDU5883]The Best Path

    problem&solution

    给定(n)(m)边无向图,每个点有权值,你要从某一个点出发,使得一笔画经过所有的路,且使得经过的节点的权值异或运算最大。输出最大值或(operatorname{impossible})

    异或的性质:
    1.一个数异或偶数次,结果为0.
    2.如果一个序列确定,异或的顺序不影响结果。

    有了性质之后,我们判断:

    1. 它必须联通。如果有的边有很多联通块,不合法。
    2. 计算每个点的度数。如果奇点的个数不为0,并且不为2,那么不合法。
    3. 最后计算每个点的度数。不用dfs。

    查分约束

    定义

    差分约束系统是求解关于一组变数的特殊不等式组的方法。如果一个系统由n个变量和m个约束条件构成,其中每个约束条件形如(x_j-x_ile b_k(i,jin[1,n],kin [1.m])),则叫做差分约束系统。它是求解关于一组变量的特殊不等式组的方法。
    通俗一点的说,差分约束系统就是一些不等式的组,而我们的目标是通过给定的约束不等式求出最大值或者最小值或者是否有解。
    之所以差分约束系统可以通过图论的最短路来求解,是因为(x_j-x_ile b_k)类似最短路中的三角不等式(d_vle d_u+w_{u,v}),即(d_v-d_ule w_{u,v})。而求取最大值的过程类似于最短路算法中的松弛过程。

    三角不等式

    [egin{equation} left{ egin{array}{lr} B-Ale c& \ C-Ble a &\ C-Ale b & end{array} ight. end{equation}]

    如果要求(C-A)的最大值,可以知道(C-A=min(b,a+c)),而这正好对应了C到A的最短路
    对三角不等式加以推广,变量(n)个,不等式(m)个,要求(x_n-x_1)的最大值,便是建图后的最短路。
    同样的,如果要求差分约束系统中(x_n-x_1)的最小值,便是求建图后的最长路。
    注意,建图后不一定存在最短路/最长路,因为可能存在无限减小或增大的负环或正环。题目一般会对应于不同的输出。判断差分约束系统是否存在解一般判断环即可。

  • 相关阅读:
    简单SSO(Single signon)的另类实现方式,钩子技术
    URL
    [恢]hdu 1287
    [恢]hdu 1220
    [恢]hdu 1015
    [恢]hdu 2095
    [恢]hdu 1862
    HDOJ 300!
    [恢]hdu 1029
    [恢]hdu 1016
  • 原文地址:https://www.cnblogs.com/liuziwen0224/p/20201013day34-001.html
Copyright © 2011-2022 走看看