精华内容
下载资源
问答
  • 奇点需要配合LINGO进行去除,有需要请联系1822285076@qq.com,需要一定费用。总程序:奇点消除lingo代码:

         奇点需要配合LINGO进行去除,有需要请联系1822285076@qq.com,需要一定费用。

    总程序:


    奇点消除lingo代码:

    展开全文
  • 最短路径算法,在旅行商问题邮递员问题之中都涉及到最短路径规划问题,在这里介绍Dijkstura算法的代码。 建立代码时,需要根据实际问题建立网络图,根据网络图写出其邻接矩阵! 下面来看一个案列代码,所给出的...

    最短路径算法,在旅行商问题和邮递员问题之中都涉及到最短路径规划问题,在这里介绍Dijkstura算法的代码。
    建立代码时,需要根据实际问题建立网络图,根据网络图写出其邻接矩阵!
    下面来看一个案列代码,所给出的代码中的邻接矩阵已经建立了,然后对于它的网络图自己可以根据邻接矩阵来画出。

    clc
    clear
    %初始值--dijkstura算法
    w=[0 2 1 8 inf inf inf inf;
        2 0 inf 6 1 inf inf inf;
        1 inf 0 7 inf inf 9 inf;
        8 6 7 0 5 1 6 inf;
        inf 1 inf 5 0 3 inf 9;
        inf inf inf 1 3 0 4 6;
        inf inf 9 6 inf 4 0 3;
        inf inf inf inf 9 6 3 0];
    n=size(w,1);
    w1=w(1,:);
    for i =1:n
        l(i)=w1(i);  %赋初值l(v),l(u0)=0,l(u1)=2,l(u2)=1,l(u3)=8,l(u4)=inf,...
        z(i)=1;      %这里所求的z(i)-1就是父亲点的意思
    end
    s=[];
    s(1)=1;          %1代表u0
    u=s(1);          %这里对于我们的u的初始值选取
    k=1;
    l
    z
    %进行循环更新l(v)、z(v)
    while k<n       %此处相当于让其初始值不变往下走
        %第一次更新l(v)、z(v)
        for i=1:n
            for j=1:k   
                if i~=s(j)
                    if l(i)>l(u)+w(u,i)
                         l(i)=l(u)+w(u,i);
                         z(i)=u;
                    end
                end
            end
        end
        l
        z
        %第二、二次更新
        ll=l;               %将更新后的l赋值给ll
        for i=1:n
            for j=1:k
                if i~=s(j)         %点集出列,不能选择
                    ll(i)=ll(i);   %边权不改变
                else
                    ll(i)=inf;      %无关联的情况下当前点与其余点的边权为无穷
                end
            end
        end
      lv=inf;                      %边权赋予给无穷
      for i=1:n                    %循环v0到v7寻找v0到v7的最短路
          if ll(i)<lv              %如果边权点小于无穷,则lv返回l(i)的值
              lv=ll(i);
              v=i;                  %顶点集更新,并且赋予给i
          end
      end
      lv;                           %输出边权
      v;                             %输出顶点集
      s(k+1)=v;                      %出列点
      k=k+1;
      u=s(k);                         %v的前一个点
    end
    l
    z
    
    

    输出结果:
    l =

     0     1     1     1     2     2     2     3
    

    z =

     1     1     1     1     2     4     3     5
    

    其中l代表的是最短路径,初始点到其与个点。z表示对应点的父亲点!

    展开全文
  • 很容易就把它归类为最短路径问题。这道题的实现思想就是正反建图。   算法思想:对于所有节点可以拆分成一个一个看。一去一回,去的过程可理解成出发点u到v的最短路径。也就是正向建图。回的过程,将所有的边反向...

      今天做到了这样一道题:最短路径
      去搜了搜,发现这其实还是一道比较经典的图论问题:邮递员送信,二者的区别就是这道题是多次,邮递员送信是1次。所以代码中主函数中增加了一个q变量。
      这道题目的特点是每次到达一个地方,都要返回起点再出发。很容易就把它归类为最短路径问题。这道题的实现思想就是正反建图

      算法思想:对于所有节点可以拆分成一个一个看。一去一回,去的过程可理解成出发点u到v的最短路径。也就是正向建图。回的过程,将所有的边反向,再计算u到v的最短路径(其实我也不是特别懂这个思想啦~)。

      上网找了很多的代码,别人写的没什么问题,完全能够AC。但是对我这种小白来说,不太友好。有个统一的特点就是:没有注释。所以花了好长时间理解,终于最后明白了每一层的含义。

      对于图的构建,主要是邻接表的方式。使用一维数组head结合结构体side来表示。正反两个图,很多资料都是将两个分开。但找到一个二维的形式,比较简单。0代表正向,1代表反向。最短路径方法是迪杰特斯拉,使用优先级队列(已经排序,按照first排序)实现。

      源代码如下:

    #include<bits/stdc++.h>
    #define ll long long
    using namespace std;
    const int mamx = 1e5+5;
    // 之前有人把这个结构体定义为node,但其实里面信息都是有关于边的 
    struct side{ 
    	// v代表该边的指向
    	/*
    	 *  next代表相同开始边u连接的其他边,使用是邻接表的结构。但其实这个next很有歧义。
    	 * 在Addedge中,next连接的是相同开始边u的不同v,但拼接的时候其实是一个反向更新 
    	*/ 
    	int v, next;  
    	ll w; // w代表该边的权重 
    }a[2][mamx]; // a代表的是边 
    
    ll num1, num2; // num1代表正向遍历当前的变数,num2代表反向遍历当前的边数 
    ll dis[2][mamx]; // dis代表各点据起始点的最短距离 
    ll head[2][mamx]; // head[][i]代表以i为起点,最新的边序号 
    bool visit[mamx]; // visit代表该节点是否已经被访问 
    int n, m;
    
    void Addedge(int i, int u, int v, int w) {
    	int num;
    	if (i == 0)
    		num = num1;
    	else
    		num = num2;
    	// num通过先自增,这样num代表的是最新的边序号 
    	a[i][++num].next = head[i][u]; // 采用倒序方法,当前边的next是上一条的编号 
    	head[i][u] = num; // head[i][u]代表以u为起点的最新的边的编号 
    	a[i][num].v = v;
    	a[i][num].w = w;
    	// 更新正向/反向当前的边数 
    	if (i == 0)
    		num1 = num;
    	else
    		num2 = num;
    }
    /*
     *	迪杰特斯拉的实现使用了优先队列,基本还是按照迪杰特斯拉的方法。
     *	区别在于使用优先队列,免除了不断寻找最小值的的过程。 
    */ 
    void dij(int x) {
    	for (int i=1; i<=n; i++) {
    		dis[x][i] = 1e16; // 寻找最小值,传入的值应该尽可能大 
    		visit[i] = 0;
    	}
    	priority_queue<pair<ll, int> > q; // ll类型代表权值,int类型是指向 
    	dis[x][1] = 0;
    	q.push(make_pair(0,1));
    	while (!q.empty()) {
    		int u = q.top().second;
    		q.pop();
    		if (visit[u] == 1)
    			continue;
    		visit[u] = 1;
    		for (int i=head[x][u]; i; i=a[x][i].next) {
    			int v = a[x][i].v;
    			ll w = a[x][i].w;
    			if (dis[x][v] > dis[x][u] + w) {
    				dis[x][v] = dis[x][u] + w;
    				/* 
    					此处传入的是负值,原因在于:我们希望是递增序列,这样从左到右遍历寻找
    					到的第一个visit[u]为false的就是当前最小的。但优先级队列默认是降序排列
    					此处加入负号,达到递增目的。 
    				*/ 
    				q.push(make_pair(-dis[x][v], v));
    			}
    		}
    	}
    } 
    int main(void) {
    	int q;
    	cin >> q; 
    	while (q--) {
    		memset(head,0,sizeof(head));
    		cin >> n >> m;
    		num1 = 0;
    		num2 = 0;
    		for (int i=1; i<=m; i++) {
    			int u, v, w;
    			cin >> u >> v >> w;
    			Addedge(0,u,v,w);
    			Addedge(1,v,u,w);
    		}
    		ll ans = 0;
    		dij(0); // 0代表正向 
    		dij(1); // 1代表反向
    		for (int i=2; i<=n; i++) { // 自身不计算,从第二个点开始 
    			ans += dis[0][i] + dis[1][i]; 
    		} 
    		cout << ans << endl;
    	}
    	return 0;
    }
    

    参考资料:
    https://blog.csdn.net/JiangHxin/article/details/104059688
    https://blog.csdn.net/weixin_36888577/article/details/79937886

    展开全文
  • 最短路径问题的延伸

    2010-05-17 19:30:00
    遇到一道与最短路径相关的问题,题目如下: 如图: 各边权值已经给出在对应边上。假设邮递员只能按照有边的路线走,以起点为1,必须经过的点为3,5,最后返回到起点1的路径中,给出一个有效算法寻找一条最小权路径...

    遇到一道与最短路径相关的问题,题目如下:

     

    如图:

     

    各边权值已经给出在对应边上。假设邮递员只能按照有边的路线走,以起点为1,必须经过的点为3,5,最后返回到起点1的路径中,给出一个有效算法寻找一条最小权路径(路径中每条边权之和最小)!
    注意:允许在某边上来回,或者经过某些点多次,或者某些点没有经过,但必须经过顶点3,5至少一次。

    现在我们来分析:

     

    从1出发,经过3、 5,回到1,要使路径最短,其实就是要决定先到3还是先到5。

     

    首先,可以把这个图存储为邻接矩阵MatrixG[6][6],求任意两点之间的最短路径Distance[6][6]有很多方法,比如Dijkstra,Floyd_Warshall,就不多说了。

     

    那么这道题的解就是:

    MIN( Distance[1][3]+Distance[3][5]+Distance[5][1], Distance[1][5]+Distance[5][3]+Distance[3][1])。

     

    而且,由于该图为无向图,所以有Distance[1][3]+Distance[3][5]+Distance[5][1] ==  Distance[1][5]+Distance[5][3]+Distance[3][1]。

     

    那么这道题的答案就直接出来了。

     

    但是,如果把题目扩展一下:

    给定一个图,节点个数为VerticesNum;

    已知的邻接矩阵MatrixG[VerticesNum][VerticesNum];

    给定出发点Stard,目的地Destination;

    给定若干个必须经过的节点(运行时输入);

    怎样给出最佳的路径呢?

     

    首先,可以根据Dijkstra或者Floyd Warshall算法得出最短路径矩阵Distance[VerticesNum][VerticesNum]。

    然后,求解此问题,需要构架出一个搜索树,这颗搜索树试探了所有的走法。

    假设出发点为a,必须经过i、j、k三个节点,终点为b。

    那么求解次问题,需要试探A(3,3)种走法(A(3,3)为3取3的排列),即:

    a i j k b ;

    a i k j b ;

    a j i k b ;

    a j k i b ;

    a k i j b ;

    a k j i b ;

     

    看那一种走法路程最短。

     

    如何构建这颗搜索树呢?

     

    可以用递归:将需要经过的节点组成一个链表PassingNodes,构建一个这样的函数route(Stard,Destination,PassingNodes)。

     

    route函数的实现:

     

    如果PassingNodes为空,那么直接返回Distance[Stard][Destination]。

    如果PassingNodes非空,那么:

    MiniWeight = INT_MAX;

    for each i in PassingNodes:

       remove node i form tPassingNodes;

       Weight = Distance[Stard][i] + route(i,Destination,PassingNodes);

       restore node i to PassingNodes;

       if (MiniWeight > Weight)
       {
        MiniWeight = Weight;
        RecordI = i;//记下路径

       }

     

    path.push(RecordI);//记下路径。

    return MiniWeight;

     

     

    这样的递归所形成的搜索树,正是对PassingNodes(假如PassingNodes中节点个数为n)中所有节点的所有排列的尝试,即n取n的排列。

     

    程序的核心就可以这样实现了,至于优化,以后有空再考虑。

     

    我写出了程序的具体实现,但分了好几个模块,就不贴出来了。

    可以参考一些我的另一篇博客:

    http://blog.csdn.net/wtewrw/archive/2010/05/06/5564454.aspx

    不是同一个问题,但是做法有点类似。

     

     

    展开全文
  • //遍历所有边回到起点的最短路径 class Solution{ private: //最短路径矩阵 void Floyd(vector<vector<int>>&graph,int N){ // N个顶点 for(int k=1;k;++k){ for(int i=1;i;++i){ for(int j=1;j;++j){ if(i==j){ ...
  • 最短路径之旅行商问题

    千次阅读 2018-05-17 15:03:17
    通过图(无向图或有向图)中所有边一次且仅一次行遍图中所有顶点的通路称为欧拉通路,通过...邮递员问题:至少经过街道一次,所以是用欧拉图解决。TSP(旅行商问题):至少经过每个点一次,则用哈密顿图解决。旅行商...
  • 问题又称为货郎担问题邮递员问题、售货员问题,是图问题中广为人知的问题。 2、基本要求 (1)上网查找TSP问题的应用实例 (2)分析求TSP问题的全局最优解的时间复杂度 (3)设计一个球近似解的算法 (4)分析...
  • 详情请看https://blog.csdn.net/RONNIE_Zz/article/details/107322970一个邮递员送信,要走完他负责投递的全部街道(所有街道都是双向通行的且每条街道可以经过不止一次),完成任务后回到邮局,应按怎样的路线走,...
  • 中国邮递员问题:邮差要设法找到一条最短路径,可以走过此地区所有的街道,且最后要回到出发点。 (遍历边,回到起点) 旅行商问题是不能回头的,一个节点访问过了不能回来了,并不需要走完所有的路,但是中国邮递员...
  • 中国邮递员问题CPP

    千次阅读 2012-09-13 18:02:50
    问题描述:Chinese poster-man problem,简称CPP,给出一张连通图,问经过...2.当有两个点是奇度点的时候,只需找到这两点间的最短路径,将最短路径上的边计入到原图中,这是得到了一张欧拉图(poj 1237 The Postal W
  • 对任意u,v∈V,当u和v连通(u可达v)时,称从u到v长度最短的路径为u到v的最短路径,该路径的长度称作距离d(u, v)。约定d(u, u) = 0,当u不可达v时d(u, v) = ∞。 Dijkstra算法 输入:带权图G(V, E, W)和s∈V,其中|...
  • 本义基于自动机理论和中国邮递员问题,提出了可信平台模块改进的有限状态机模型与相应的优化测试方案,通过寻找一条遍历有限状态机模型中每一条转移至少一次的最短路径的方法,从而生成费用优化的测试序列。...
  • ArcGIS网络分析之中国邮递员问题

    千次阅读 2018-09-07 16:49:15
    邮递员每天从邮局出发,走遍该地区所有街道再返回邮局,问题是他应如何安排送信的路线可以使所走的总路程最短。 使用路径分析,如果使用网络交汇点作为停靠点,那么有些路(下图中黑色线)还是无法经过。 我们...
  • 中国邮递员问题+代码实现(cpp)

    千次阅读 多人点赞 2019-05-16 11:34:53
    中国邮递员问题是一个和旅行商问题比较相关但又不太相同的一个问题,而且个人感觉理解的难度更大一点,当然,这就是仁者见仁,智者见智了,旅行商问题是不能回头的,一个节点访问过了不能回来了,并不需要走完所有的...
  • 图论--中国邮递员问题

    千次阅读 2011-04-27 20:25:47
    中国邮递员问题就比较悲催了。前后花了我大概有三天的时间。。今天才做完的。。   首先描述一下问题邮递员从邮局出发送信,要求对辖区内每条街都至少通过一次,再回邮局。在此条件下,怎样选择一条最短路线?...
  • 【BZOJ5471】[FJOI2018]邮递员问题(动态规划) 题面 BZOJ 洛谷 给定平面上若干个点,保证这些点在两条平行线上,给定起点终点,求从起点出发,遍历所有点后到达终点的最短路径长度。 题解 不会做,于是点开LOJ,点...
  • P1629 邮递员送信

    2020-04-05 10:57:08
    因为路是单向的,快递从1到其他点,还要从其他点回来,是多源最短路径问题。可是floyd的O(n^3)只有40分。 回来的时候是其他点到1点,我们想如果是1到其他点就好了,我们把邻接矩阵倒过来 还有一个有重边,对...
  • DP过程很简单,遍历所有情况取最短路径就行,因为最短哈密顿回路本身就是一个NPC问题,效率不高。 #include <vector> #include <iostream> using namespace std; //最短哈密顿回路问题 NP完全问...
  • 这是一款基于QT实现的一笔画软件,该项目的背景起源于中国邮递员问题,本程序用来模拟邮递员选择最短路径送完所有快递再回到出发点。具体来说,用户可以通过的工具栏在画板区域进行画点并连线,最后形成的图如果能够...
  • Java的开放优化提供了图论和网络优化中发现的常用算法的框架和实现,例如最短路径邮递员问题
  • tsp旅行商问题和高级搜索方法

    千次阅读 2015-12-23 16:02:33
    中国邮递员问题tsp 输入:中国144个城市数据 输出:最短路径序列及路径长度 1. 采用局部搜索算法实现 2. 采用模拟退化算法实现 二、 程序设计与算法分析 1. 待解决的问题实际上是优化与组合优化问题。很多...
  • 图论中的NP问题

    千次阅读 2017-07-21 18:43:03
    中国邮递员问题如果是欧拉图,就直接找欧拉回路就行,如果不是的话,就是找所有奇度顶点,两两配对,就形成了欧拉图,权值设置为两点之间的最短路径(使用Floyd算法)。旅行商问题设城市的个数为 nn, dijdij 是两个...
  • 通过JavaScript学习数据结构和算法 您需要对JavaScript编程语言有基本的了解,才能继续进行此存储库中的代码。...中国邮递员问题 2满意度 流算法 最大流量 最小切割 最小成本最大流量 最大二分匹配 顶点覆盖
  • 2021-01-31

    2021-01-31 11:04:06
    这次还是落谷上面的题,“P1629 邮递员送信”。 题目: 这道题乍一看,似乎是求单源最短路径的模版题。所以,一看到题就想到了dijstrak算法,但是看似求单源最短路径、其实有陷阱。那就题目要求每送到一个城市节点...
  • 相比于经典的迪杰斯特拉算法和spfa算法,Floyd算法更适合求解多源点最短路径,即n个点之间的最短路径分别是多少。FLoyd算法和运行n次dijskral算法的时间复杂度都是O(n3)O(n^3)O(n3) ,但是Floyd算法可以处理含有负权...
  • PAT 图

    2020-11-24 21:31:04
    图 A1134 Vertex Cover 图 ...A1122 Hamiltonian Cycle ...中国邮递员问题 A1146 Topological Order 拓扑序列的判别 A1003 Emergency 救援最短路径和最大救援部队 Dijkstra算法 A1072 Gas Statio
  • 题意:大致就是邮递员要从0号 送快件,一共有n个地方,要求从0开始走完所有的节点在回到0的最短路径。先用Floyd跑出来最短路,然后就是一个裸TSP问题了 TSP:顾名思义,旅行商问题,就是从起点出发遍历n个城市在...
  • 中国邮递员问题 2满意度 流算法 最大流量 最小切割 最小成本最大流量 最大二分匹配 顶点覆盖 动态编程 杆切割 最大总和(1D,2D) 硬币找零 最长公共子序列 最长递增子序列 矩阵乘法 编辑距离(Levenshtein距离) 0/...

空空如也

空空如也

1 2
收藏数 37
精华内容 14
关键字:

邮递员最短路径问题