zoukankan      html  css  js  c++  java
  • 差分约束笔记

    学到差分约束。表示一点不懂。到处搜啊搜。

    PS:我的博文是边写边学的,其中很少删改 - -。。(其实就是在做笔记么。。这样理解快些),如果想看结论就看最下面的。
    在“摘”后面的文章中有(*  *)标志的为笔记
    ============================P1===begin=============================

    什么百科,文库的看也看不懂。然后找到一篇博文,大概有点概念了。慢慢更新哈 - -
    这篇博文地址:点击打开链接
    我就抄点过来呗。

    • :给出三个不等式,b-a<=k1,c-b<=k2,c-a<=k3,求出c-a的最大值,我们可以把a,b,c转换成三个点,k1,k2,k3是边上的权由题我们可以得知,这个有向图中,由题b-a<=k1,c-b<=k2,得出c-a<=k1+k2(*我不懂怎样的出的*),因此比较k1+k2和k3的大小,求出最小的就是c-a的最大值了
    • 笔记:
      因为要求最大值,所以k3或第二条路径k1+k2要最小呵= =。呀呵,难道就是比较k3和k1+k2哪个小?哪个小哪个的差就越大= =呵呵。。。
      额。。到底c-a这种哪个是起点哪个是终点阿= = 。。。    soga,因为是c-a,所以一定是a到c(有向)的路径(想起我们物理老师说的没有你爸就没有你之类的话,貌似就有点懂了。)就是一定有了一条路径从a到c,才能有c减去这个权值等于a(貌似是<=吧)
    • :根据以上的解法,我们可能会猜到求解过程实际就是求从a到c的最短路径,没错的....简单的说就是从a到c沿着某条路径后把所有权值和k求出就是c-a<=k的一个
    • 笔记:因为要使得c-a<=k3的k3最小,且a到c的最短路加的是最小的权值,所以c-a就一定最大,即k3=d[c]-d[a],d是最短路。
      差分约束其实就是将所有的xi(1<=i<=n,n为节点数,即上面的那种a呀,b呀,c呀)当成有向图节点,根据权值构造个图,然后xi就是d[i]

    (*后记:根据P2的说法,要建一个根开始扫,即增加一个源点s,s与所有定点相连,边权均为0*)
    用扫啊扫。SPFA, Bellman什么的。求出最短路的就行了。

    ================================end===============================
    ============================P2===begin=============================

    P1说的貌似不是差分约束- - ,好像是最基础的理解- -。。。其实楼上的有个概念含糊不清,就是那个c-a<=k3最小那里。。

    (摘为百度百科:点击打开链接

    给出差分约束定义:
    摘: 如果一个系统由n个变量和m个约束条件组成,其中每个约束条件形如xj-xi<=bk(i,j∈[1,n],k∈[1,m]),则称其为差分约束系统(system of difference constraints)。
    亦即,差分约束系统是求解关于一组变量的特殊不等式组的方法。

    P1含糊不清的奇怪定义应该改为:
    根据最短路的三角不等式定理:d[v]<=d[u]+w[u,v],移项,得d[v]-d[u]<=w[u,v]。(和差分约束的定义非常像)即差分约束
    摘:  因此,以每个变量xi为结点,对于约束条件xj-xi<=bk,连接一条边(i,j),边权为bk(*即P1说的Ki*)。我们再增加一个源点s,s与所有定点相连,边权均为0。
    对这个图,以s为源点运行Bellman-ford算法(或SPFA算法),最终{d[i]}即为一组可行解。

    ================================end===============================

    ============================P3===begin=============================
    呵呵呵呵呵呵------~~~~。。好像我懂了。。。大概总结一下:
    建一个图G,根为S,d[S]=0;
    然后S与每一个节点(即xi)连一条边权为0的边。然后在x1到xn根据ki,i∈[1,n]来建边,注意,因为根据P2的移项前后,d[v]是在后面得到的,
    故v为终点,u为起点,即如果有x1-x2<=k1,那么建的边应该是w[x2][x1] = k1;//起点是x2,终点是x1。然后扫啊扫~~。然后xi就是d[i]

    ================================end===============================

    ===========================13.9.2更新===============================

    自己用SPFA写了代码,呵呵= =

    #include <iostream>
    #include <queue>
    #include <vector>
    using namespace std;
    const int MAXN = 1000;
    const int INF = 1000000000;
    //我习惯用这样的邻接表,呵呵
    struct ed{int v, w;};
    struct nod
    {
    	vector<ed> edge;
    }node[MAXN];
    int n, m, i, v, w, t;
    int d[MAXN];
    ed temp;
    queue<int> q;
    bool qvis[MAXN]={0};
    int vis[MAXN]={0};
    
    int main()
    {
    	cin >> n >> m; //n是X的数量,m是K的数量
    	for(i = 0; i < m; i++)
    	{
    		cin >> temp.v >> t >> temp.w;
    		node[t].edge.push_back(temp);
    	}
            //初始化,顺便初始化s节点
    	for(i = 1; i <= n; i++)
    	{
    		temp.v = i, temp.w = 0;
    		node[0].edge.push_back(temp);
    		d[i] = INF;
    	}
    	d[0] = 0;
            //压入s
    	q.push(0);
            //SPFA
    	while(!q.empty())
    	{
    		t = q.front(); q.pop();
    		for(i = 0; i < node[t].edge.size(); i++)
    		{
    			v = node[t].edge[i].v;
    			w = node[t].edge[i].w;
    			if(d[v] > d[t] + w)
    			{
    				d[v] = d[t] + w;
    				if(!qvis[v])
    				{
    					qvis[v] = 1;
    					q.push(v);
    					vis[v]++;
    				}
    				if(vis[v] > n)
    				{
    					cout << "No answer!
    ";
    					while(!q.empty())q.pop();
    					break;
    				}
    			}
    		}
    		qvis[t] = 0;
    	}
    	for(i = 1; i <= n; i++)
    		cout<<'x'<<i<<':'<<d[i]<<endl;
    
    	return 0;
    }

    ================================end===============================

    ===========================13.9.2更新===============================

    摘自NOCOW(点击打开链接):

    如果一个系统由n个变量和m个约束条件组成,其中每个约束条件形如xj-xi<=bk(i,j∈[1,n],k∈[1,m]),则其为差分约束系统(system of difference constraints)。亦即,差分约束系统是关于一组变量的特殊不等式组。求解差分约束系统,可以转化成图论的单源最短路径问题。

    观察xj-xi<=bk,会发现它类似最短路中的三角不等式d[v]<=d[u]+w[u,v],即d[v]-d[u]&lt;=w[u,v]。因此,以每个变量xi为结点,对于约束条件xj-xi<=bk,连接一条边(i,j),边权为bk。我们再增加一个源点s,s与所有点相连,边权均为0。对这个图,以s为源点运行bellman-ford算法,最终{d[i]}即为一组可行解。(差分约束系统的解的一个特点是,当将所有变量同时增加相同的大小,约束条件依然成立)

    ================================end===============================

     

  • 相关阅读:
    Docker基本架构
    Dockerfile怎么创建镜像
    Dockerfile的指令
    Dockerfile基本结构
    Docker其它安全特性
    运行项目psychologicalTest
    第2章 安装Nodejs 2-4 Linux下安装Nodejs
    第2章 安装Nodejs 2-3 Windows下安装Nodejs
    第2章 安装Nodejs Nodejs基础 课程介绍
    2-2 第二天 利用 QQ 浏览器代理调试端口
  • 原文地址:https://www.cnblogs.com/iwtwiioi/p/3521805.html
Copyright © 2011-2022 走看看