您现在的位置是:首页 >技术杂谈 >百子作业 —— 中国邮递员问题网站首页技术杂谈
百子作业 —— 中国邮递员问题
题目
严老师和宋老板去勘测武威市区的道路网,每一条路都需要勘测,且需要两人合作.武威市区可以近似地看成六横六纵组成的道路网,自西向东依次为学府路、民勤路、西关路、中关路、富民路、滨河路;自北向南依次为雷海路、宣武路、祁连大道、商业街、南关路、古浪街,任意两个相邻的路口之间的间距均可以认为是500米。
 初始时,严老师和宋老板在民勤路与商业街相交的十字路口,最终仍然需要回到这个位置,则他俩至少需要走多少千米?并设计一条路线。
解析
题目对应的图。
 
 本题是找欧拉回路。路径可以重复走,节点可以重复访问。
 由于本题的权是相同的,都是  
     
      
       
       
         500 
        
       
         m 
        
       
      
        500m 
       
      
    500m,因此本题节点虽然多,但是难度降低很多。
求解过程
统计图中点度数
 
     
      
       
        
        
          v 
         
        
          11 
         
        
       
      
        v_{11} 
       
      
    v11 的度数为  
     
      
       
       
         2 
        
       
      
        2 
       
      
    2。
  
     
      
       
        
        
          v 
         
        
          12 
         
        
       
      
        v_{12} 
       
      
    v12 的度数为  
     
      
       
       
         3 
        
       
      
        3 
       
      
    3。
  
     
      
       
        
        
          v 
         
        
          13 
         
        
       
      
        v_{13} 
       
      
    v13 的度数为  
     
      
       
       
         3 
        
       
      
        3 
       
      
    3。
  
     
      
       
        
        
          v 
         
        
          14 
         
        
       
      
        v_{14} 
       
      
    v14 的度数为  
     
      
       
       
         3 
        
       
      
        3 
       
      
    3。
  
     
      
       
        
        
          v 
         
        
          15 
         
        
       
      
        v_{15} 
       
      
    v15 的度数为  
     
      
       
       
         3 
        
       
      
        3 
       
      
    3。
  
     
      
       
        
        
          v 
         
        
          16 
         
        
       
      
        v_{16} 
       
      
    v16 的度数为  
     
      
       
       
         2 
        
       
      
        2 
       
      
    2。
  
     
      
       
        
        
          v 
         
        
          21 
         
        
       
      
        v_{21} 
       
      
    v21 的度数为  
     
      
       
       
         3 
        
       
      
        3 
       
      
    3。
  
     
      
       
        
        
          v 
         
        
          22 
         
        
       
      
        v_{22} 
       
      
    v22 的度数为  
     
      
       
       
         4 
        
       
      
        4 
       
      
    4。
  
     
      
       
        
        
          v 
         
        
          23 
         
        
       
      
        v_{23} 
       
      
    v23 的度数为  
     
      
       
       
         4 
        
       
      
        4 
       
      
    4。
  
     
      
       
        
        
          v 
         
        
          24 
         
        
       
      
        v_{24} 
       
      
    v24 的度数为  
     
      
       
       
         4 
        
       
      
        4 
       
      
    4。
  
     
      
       
        
        
          v 
         
        
          25 
         
        
       
      
        v_{25} 
       
      
    v25 的度数为  
     
      
       
       
         4 
        
       
      
        4 
       
      
    4。
  
     
      
       
        
        
          v 
         
        
          26 
         
        
       
      
        v_{26} 
       
      
    v26 的度数为  
     
      
       
       
         3 
        
       
      
        3 
       
      
    3。
  
     
      
       
        
        
          v 
         
        
          31 
         
        
       
      
        v_{31} 
       
      
    v31 的度数为  
     
      
       
       
         3 
        
       
      
        3 
       
      
    3。
  
     
      
       
        
        
          v 
         
        
          32 
         
        
       
      
        v_{32} 
       
      
    v32 的度数为  
     
      
       
       
         4 
        
       
      
        4 
       
      
    4。
  
     
      
       
        
        
          v 
         
        
          33 
         
        
       
      
        v_{33} 
       
      
    v33 的度数为  
     
      
       
       
         4 
        
       
      
        4 
       
      
    4。
  
     
      
       
        
        
          v 
         
        
          34 
         
        
       
      
        v_{34} 
       
      
    v34 的度数为  
     
      
       
       
         4 
        
       
      
        4 
       
      
    4。
  
     
      
       
        
        
          v 
         
        
          35 
         
        
       
      
        v_{35} 
       
      
    v35 的度数为  
     
      
       
       
         4 
        
       
      
        4 
       
      
    4。
  
     
      
       
        
        
          v 
         
        
          36 
         
        
       
      
        v_{36} 
       
      
    v36 的度数为  
     
      
       
       
         3 
        
       
      
        3 
       
      
    3。
  
     
      
       
        
        
          v 
         
        
          41 
         
        
       
      
        v_{41} 
       
      
    v41 的度数为  
     
      
       
       
         3 
        
       
      
        3 
       
      
    3。
  
     
      
       
        
        
          v 
         
        
          42 
         
        
       
      
        v_{42} 
       
      
    v42 的度数为  
     
      
       
       
         4 
        
       
      
        4 
       
      
    4。
  
     
      
       
        
        
          v 
         
        
          43 
         
        
       
      
        v_{43} 
       
      
    v43 的度数为  
     
      
       
       
         4 
        
       
      
        4 
       
      
    4。
  
     
      
       
        
        
          v 
         
        
          44 
         
        
       
      
        v_{44} 
       
      
    v44 的度数为  
     
      
       
       
         4 
        
       
      
        4 
       
      
    4。
  
     
      
       
        
        
          v 
         
        
          45 
         
        
       
      
        v_{45} 
       
      
    v45 的度数为  
     
      
       
       
         4 
        
       
      
        4 
       
      
    4。
  
     
      
       
        
        
          v 
         
        
          46 
         
        
       
      
        v_{46} 
       
      
    v46 的度数为  
     
      
       
       
         3 
        
       
      
        3 
       
      
    3。
  
     
      
       
        
        
          v 
         
        
          51 
         
        
       
      
        v_{51} 
       
      
    v51 的度数为  
     
      
       
       
         3 
        
       
      
        3 
       
      
    3。
  
     
      
       
        
        
          v 
         
        
          52 
         
        
       
      
        v_{52} 
       
      
    v52 的度数为  
     
      
       
       
         4 
        
       
      
        4 
       
      
    4。
  
     
      
       
        
        
          v 
         
        
          53 
         
        
       
      
        v_{53} 
       
      
    v53 的度数为  
     
      
       
       
         4 
        
       
      
        4 
       
      
    4。
  
     
      
       
        
        
          v 
         
        
          54 
         
        
       
      
        v_{54} 
       
      
    v54 的度数为  
     
      
       
       
         4 
        
       
      
        4 
       
      
    4。
  
     
      
       
        
        
          v 
         
        
          55 
         
        
       
      
        v_{55} 
       
      
    v55 的度数为  
     
      
       
       
         4 
        
       
      
        4 
       
      
    4。
  
     
      
       
        
        
          v 
         
        
          56 
         
        
       
      
        v_{56} 
       
      
    v56 的度数为  
     
      
       
       
         3 
        
       
      
        3 
       
      
    3。
  
     
      
       
        
        
          v 
         
        
          61 
         
        
       
      
        v_{61} 
       
      
    v61 的度数为  
     
      
       
       
         2 
        
       
      
        2 
       
      
    2。
  
     
      
       
        
        
          v 
         
        
          62 
         
        
       
      
        v_{62} 
       
      
    v62 的度数为  
     
      
       
       
         3 
        
       
      
        3 
       
      
    3。
  
     
      
       
        
        
          v 
         
        
          63 
         
        
       
      
        v_{63} 
       
      
    v63 的度数为  
     
      
       
       
         3 
        
       
      
        3 
       
      
    3。
  
     
      
       
        
        
          v 
         
        
          64 
         
        
       
      
        v_{64} 
       
      
    v64 的度数为  
     
      
       
       
         3 
        
       
      
        3 
       
      
    3。
  
     
      
       
        
        
          v 
         
        
          65 
         
        
       
      
        v_{65} 
       
      
    v65 的度数为  
     
      
       
       
         3 
        
       
      
        3 
       
      
    3。
  
     
      
       
        
        
          v 
         
        
          66 
         
        
       
      
        v_{66} 
       
      
    v66 的度数为  
     
      
       
       
         2 
        
       
      
        2 
       
      
    2。
配对
图中,奇点有: 
     
      
       
        
        
          v 
         
        
          12 
         
        
       
         , 
        
        
        
          v 
         
        
          13 
         
        
       
         , 
        
        
        
          v 
         
        
          14 
         
        
       
         , 
        
        
        
          v 
         
        
          15 
         
        
       
         , 
        
        
        
          v 
         
        
          21 
         
        
       
         , 
        
        
        
          v 
         
        
          26 
         
        
       
         , 
        
        
        
          v 
         
        
          31 
         
        
       
         , 
        
        
        
        
          v 
         
        
          36 
         
        
       
         , 
        
        
        
          v 
         
        
          41 
         
        
       
         , 
        
        
        
          v 
         
        
          46 
         
        
       
         , 
        
        
        
          v 
         
        
          51 
         
        
       
         , 
        
        
        
          v 
         
        
          56 
         
        
       
         , 
        
        
        
          v 
         
        
          62 
         
        
       
         , 
        
        
        
          v 
         
        
          63 
         
        
       
         , 
        
        
        
          v 
         
        
          64 
         
        
       
         , 
        
        
        
          v 
         
        
          65 
         
        
       
      
        v_{12},v_{13},v_{14},v_{15},v_{21},v_{26},v_{31},\v_{36},v_{41},v_{46},v_{51},v_{56},v_{62},v_{63},v_{64},v_{65} 
       
      
    v12,v13,v14,v15,v21,v26,v31,v36,v41,v46,v51,v56,v62,v63,v64,v65,合计  
     
      
       
       
         16 
        
       
      
        16 
       
      
    16 个。
 把他们配对,枚举所有配对,找到代价最小的配对。
 由于本题的权值相同,因此,最小配对为  
     
      
       
       
         ( 
        
        
        
          v 
         
        
          12 
         
        
       
         , 
        
        
        
          v 
         
        
          13 
         
        
       
         ) 
        
       
         , 
        
       
         ( 
        
        
        
          v 
         
        
          14 
         
        
       
         , 
        
        
        
          v 
         
        
          15 
         
        
       
         ) 
        
       
         ( 
        
        
        
          v 
         
        
          21 
         
        
       
         , 
        
        
        
          v 
         
        
          31 
         
        
       
         ) 
        
       
         , 
        
       
         ( 
        
        
        
          v 
         
        
          26 
         
        
       
         , 
        
        
        
          v 
         
        
          36 
         
        
       
         ) 
        
       
         , 
        
        
       
         ( 
        
        
        
          v 
         
        
          41 
         
        
       
         , 
        
        
        
          v 
         
        
          51 
         
        
       
         ) 
        
       
         , 
        
       
         ( 
        
        
        
          v 
         
        
          46 
         
        
       
         , 
        
        
        
          v 
         
        
          56 
         
        
       
         ) 
        
       
         , 
        
       
         ( 
        
        
        
          v 
         
        
          62 
         
        
       
         , 
        
        
        
          v 
         
        
          63 
         
        
       
         ) 
        
       
         , 
        
       
         ( 
        
        
        
          v 
         
        
          64 
         
        
       
         , 
        
        
        
          v 
         
        
          65 
         
        
       
         ) 
        
       
      
        (v_{12},v_{13}),(v_{14},v_{15})(v_{21},v_{31}),(v_{26},v_{36}),\(v_{41},v_{51}),(v_{46},v_{56}),(v_{62},v_{63}),(v_{64},v_{65}) 
       
      
    (v12,v13),(v14,v15)(v21,v31),(v26,v36),(v41,v51),(v46,v56),(v62,v63),(v64,v65)。
添加重边,去掉奇点
如下图所示,红色为添加的边。
 
 这样,新图中没有奇点,是一个欧拉图。
 注意,将原来图中节点编号按照顺序进行修改,主要是为了计算机编程方便。
答案
最短路径
最短距离 ( 60 + 8 ) ∗ 500 = 34 , 000 m (60+8)*500=34,000m (60+8)∗500=34,000m,其中 60 60 60 为原有路径, 8 8 8 为构造欧拉图增加的路径。
方案
 
     
      
       
       
         10 
        
       
         → 
        
       
         4 
        
       
         → 
        
       
         3 
        
       
         → 
        
       
         2 
        
       
         → 
        
       
         1 
        
       
         → 
        
       
         7 
        
       
         → 
        
       
         8 
        
       
         → 
        
       
         2 
        
       
         → 
        
       
         3 
        
       
         → 
        
       
         9 
        
       
         → 
        
       
         8 
        
       
         → 
        
       
         14 
        
       
         → 
        
        
       
         13 
        
       
         → 
        
       
         7 
        
       
         → 
        
       
         13 
        
       
         → 
        
       
         19 
        
       
         → 
        
       
         20 
        
       
         → 
        
       
         14 
        
       
         → 
        
       
         15 
        
       
         → 
        
       
         9 
        
       
         → 
        
       
         10 
        
       
         → 
        
       
         11 
        
       
         → 
        
       
         5 
        
       
         → 
        
        
       
         4 
        
       
         → 
        
       
         5 
        
       
         → 
        
       
         6 
        
       
         → 
        
       
         12 
        
       
         → 
        
       
         11 
        
       
         → 
        
       
         17 
        
       
         → 
        
       
         16 
        
       
         → 
        
       
         15 
        
       
         → 
        
       
         21 
        
       
         → 
        
       
         20 
        
       
         → 
        
       
         26 
        
       
         → 
        
        
       
         25 
        
       
         → 
        
       
         19 
        
       
         → 
        
       
         25 
        
       
         → 
        
       
         31 
        
       
         → 
        
       
         32 
        
       
         → 
        
       
         26 
        
       
         → 
        
       
         27 
        
       
         → 
        
       
         21 
        
       
         → 
        
       
         22 
        
       
         → 
        
       
         23 
        
       
         → 
        
        
       
         17 
        
       
         → 
        
       
         18 
        
       
         → 
        
       
         12 
        
       
         → 
        
       
         18 
        
       
         → 
        
       
         24 
        
       
         → 
        
       
         23 
        
       
         → 
        
       
         29 
        
       
         → 
        
       
         28 
        
       
         → 
        
       
         27 
        
       
         → 
        
       
         33 
        
       
         → 
        
       
         32 
        
       
         → 
        
        
       
         33 
        
       
         → 
        
       
         34 
        
       
         → 
        
       
         35 
        
       
         → 
        
       
         29 
        
       
         → 
        
       
         30 
        
       
         → 
        
       
         24 
        
       
         → 
        
       
         30 
        
       
         → 
        
       
         36 
        
       
         → 
        
       
         35 
        
       
         → 
        
       
         34 
        
       
         → 
        
        
       
         28 
        
       
         → 
        
       
         22 
        
       
         → 
        
       
         16 
        
       
         → 
        
       
         10 
        
       
      
        10	o 4	o 3	o 2	o 1	o 7	o 8	o 2	o 3	o 9	o 8	o 14	o\ 13	o 7	o 13	o 19	o 20	o 14	o 15	o 9	o 10	o 11	o 5	o\ 4	o 5	o 6	o 12	o 11	o 17	o 16	o 15	o 21	o 20	o 26	o\ 25	o 19	o 25	o 31	o 32	o 26	o 27	o 21	o 22	o 23	o\ 17	o 18	o 12	o 18	o 24	o 23	o 29	o 28	o 27	o 33	o 32	o\ 33	o 34	o 35	o 29	o 30	o 24	o 30	o 36	o 35	o 34	o\ 28	o 22	o 16	o 10 
       
      
    10→4→3→2→1→7→8→2→3→9→8→14→13→7→13→19→20→14→15→9→10→11→5→4→5→6→12→11→17→16→15→21→20→26→25→19→25→31→32→26→27→21→22→23→17→18→12→18→24→23→29→28→27→33→32→33→34→35→29→30→24→30→36→35→34→28→22→16→10
 注意:答案不唯一。
C++代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+10;
int edge[N][N];
//为了方便优先访问编号小的节点,这里使用邻接矩阵来存边
//如果使用vector来存图,那还需要对每个节点连接的边进行排序
int ans[N*N];
int p=0;//ans指针 
int degree[N];//用于储存每个点的度,以求起点
int n;//节点数量 
void dfs(int now) {
    for (int i=1;i<=n;i++){//顺序寻找可访问的边,优先找编号小的节点
        if (edge[now][i]){//若这条边尚未访问过
            edge[now][i]--;//已访问过的边要删去,防止重复访问
            edge[i][now]--;//有向图的话请删去这一行
            dfs(i);
        }
    }
    ans[++p]=now;//将访问的节点储存进答案数组
    //由于递归的特性,这里储存的是逆序过程
}
int main() {
    ios::sync_with_stdio(false);
    int m;//边的个数
    cin>>n>>m;
    for(int i=1;i<=m;i++) {
        int a,b;
        cin>>a>>b>>c;
        edge[a][b]++;
        edge[b][a]++;//有向图的话删去这行
        degree[a]++;
		degree[b]++;//两个点的度都+1
    }
    int start;//起点 
    cin>>start;
    dfs(start);//dfs寻找欧拉路
    cout<<(p-1)*500<<"
";//计算总代价 
    for(int i=p;i>=1;i--) {
        cout<<ans[i]<<" ";//输出给定的欧拉路
	}
    cout<<"
";
    return 0; 
}
 
对应的测试数据如下。
36 68
1 2 500
2 3 500
2 3 500
3 4 500
4 5 500
4 5 500
5 6 500
1 7 500
2 8 500
3 9 500
4 10 500
5 11 500
6 12 500
7 8 500
8 9 500
9 10 500
10 11 500
11 12 500
7 13 500
7 13 500
8 14 500
9 15 500
10 16 500
11 17 500
12 18 500
12 18 500
13 14 500
14 15 500
15 16 500
16 17 500
17 18 500
13 19 500
14 20 500
15 21 500
16 22 500
17 23 500
18 24 500
19 20 500
20 21 500
21 22 500
22 23 500
23 24 500
19 25 500
19 25 500
20 26 500
21 27 500
22 28 500
23 29 500
24 30 500
24 30 500
25 26 500
26 27 500
27 28 500
28 29 500
29 30 500
25 31 500
26 32 500
27 33 500
28 34 500
29 35 500
30 36 500
31 32 500
32 33 500
32 33 500
33 34 500
34 35 500
34 35 500
35 36 500
1
                
            




U8W/U8W-Mini使用与常见问题解决
QT多线程的5种用法,通过使用线程解决UI主界面的耗时操作代码,防止界面卡死。...
stm32使用HAL库配置串口中断收发数据(保姆级教程)
分享几个国内免费的ChatGPT镜像网址(亲测有效)
Allegro16.6差分等长设置及走线总结