旅行商问题(tsp)之分支定界法

http://soj.sysu.edu.cn/show_problem.php?pid=1001&cid=1816

做了一个晚上的题,真是弱爆了...

其实就是深搜最短路,不过加了一个upper bound用来剪枝,因为数据比较小可以过!

深搜还是要熟悉啊!

 1 #include <bits/stdc++.h>
 2
 3 using namespace std;
 4
 5 double graph[25][25];
 6 int vis[25];
 7 double a[25];
 8 double ub;
 9 double ans;
10
11
12 struct point {
13     int x;
14     int y;
15 }p[25];
16
17 double dis(point a, point b)
18 {
19     return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
20 }
21
22 void dfs(int n, int x, double temp, int cnt)
23 {
24 //    printf("%.2lf\n", temp);
25     if(cnt == n-2)
26     {
27         ub = min(ub, temp+graph[x][n-1]);
28         return ;
29     }
30     vis[x]=1;
31     for(int i=0; i<n-1; i++)
32     {
33         if(graph[x][i] && !vis[i])
34         {
35             temp += graph[x][i];
36             if(temp < ub)
37                 dfs(n, i, temp, cnt+1);
38             temp -= graph[x][i];
39             vis[i]=0;
40
41         }
42     }
43
44
45 }
46
47
48 int main()
49 {
50     int t, n, x, y;
51     scanf("%d", &t);
52     while(t--)
53     {
54         int cnt=0;
55         ub=0x3f3f3f3f;
56         double temp=0;
57         memset(graph, 0, sizeof(graph));
58         memset(vis, 0, sizeof(vis));
59
60         scanf("%d", &n);
61         for(int i=0; i<n; i++)
62             scanf("%d%d", &p[i].x, &p[i].y);
63
64         for(int i=0; i<n; i++)
65             for(int j=0; j<n; j++)
66                 graph[i][j] = dis(p[i], p[j]);
67
68         vis[0]=1;
69         dfs(n,0,temp,0);
70         printf("%.2lf\n", ub);
71     }
72     return 0;
73 } 
时间: 2024-08-02 15:51:25

旅行商问题(tsp)之分支定界法的相关文章

poj3311 Hie with the Pie 旅行商问题(TSP)

题目链接 http://poj.org/problem?id=3311 Hie with the Pie Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 5094   Accepted: 2716 Description The Pizazz Pizzeria prides itself in delivering pizzas to its customers as fast as possible. Unfortuna

07_旅行商问题(TSP问题,货郎担问题,经典NPC难题)

问题来源:刘汝佳<算法竞赛入门经典--训练指南> P61 问题9: 问题描述:有n(n<=15)个城市,两两之间均有道路直接相连,给出每两个城市i和j之间的道路长度L[i][j],求一条经过每个城市一次且仅一次,最后回到起点的路线,使得经过的道路总长度最短(城市编号为0~n-1). 分析: 1.因为最后走的路线为一个环,可以设城市0为起点城市. 2.将每个城市看作二进制的一个位(1代表有,0代表没有),则数k可以表示一些城市的集合(例如k=13,二进制表示为1101,表示城市0,2,3的

旅行商问题(TSP)之动态规划解法

http://soj.sysu.edu.cn/show_problem.php?pid=1000&cid=1769 sicily Traveling Salesman Problem 有编号1到N的N个城市,问从1号城市出发,遍历完所有的城市并最后停留在N号城市的最短路径长度. Input 第一行整数 T :T组数据 (T<=20) 每个case 读入一个N( 2 <= N <= 20),接着输入N行,第i行有两个整数 xi,yi表示 第i个城市坐标轴上的坐标,两个城市的距离定义

遗传算法(三)—— 旅行商问题TSP

遗传算法 (GA) 算法最主要的就是我们要想明白什么是他的 DNA 和怎么样对个体进行评估 (他们的 Fitness). Fitness和DNA 这次的编码 DNA 方式又不一样, 我们可以尝试对每一个城市有一个 ID, 那经历的城市顺序就是按 ID 排序咯. 比如说商人要经过3个城市, 我们就有 0-1-2 0-2-1 1-0-2 1-2-0 2-0-1 2-1-0 这6种排列方式. 每一种排列方式我们就能把它当做一种 DNA 序列, 用 numpy 产生这种 DNA 序列的方式很简单. >>

基础不牢,地动山摇

这么多天过去了,即使自己步履蹒跚达到了一个短暂的小目标,但是自己的水平是怎样,自己比任何人都清楚. 我还是打算从头开始,按照知乎大神的步骤走上一次. 基本算法:1.枚举 1753 2965 2.贪心 1328 2109 2586 3.递归和分治法 4.递推 5.构造法 3295 6.模拟法 1068 1573 2993 2996 图算法: 1.图的深度优先遍历和广度优先遍历 2.最短路算法--多种 3.最小生成树算法 1789 2485 1258 3026 4.拓扑排序 1094 5.二分图最大

优化算法入门系列文章目录(更新中):

1. 模拟退火算法 2. 遗传算法 一. 爬山算法 ( Hill Climbing ) 介绍模拟退火前,先介绍爬山算法.爬山算法是一种简单的贪心搜索算法,该算法每次从当前解的临近解空间中选择一个最优解作为当前解,直到达到一个局部最优解. 爬山算法实现很简单,其主要缺点是会陷入局部最优解,而不一定能搜索到全局最优解.如图1所示:假设C点为当前解,爬山算法搜索到A点这个局部最优解就会停止搜索,因为在A点无论向那个方向小幅度移动都不能得到更优的解. 图1     二. 模拟退火(SA,Simulate

大白话解析模拟退火算法(转)

优化算法入门系列文章目录(更新中): 1. 模拟退火算法 2. 遗传算法 一. 爬山算法 ( Hill Climbing ) 介绍模拟退火前,先介绍爬山算法.爬山算法是一种简单的贪心搜索算法,该算法每次从当前解的临近解空间中选择一个最优解作为当前解,直到达到一个局部最优解. 爬山算法实现很简单,其主要缺点是会陷入局部最优解,而不一定能搜索到全局最优解.如图1所示:假设C点为当前解,爬山算法搜索到A点这个局部最优解就会停止搜索,因为在A点无论向那个方向小幅度移动都不能得到更优的解. 图1 二. 模

模拟退火算法简介

优化算法入门系列文章目录(更新中): 1. 模拟退火算法 2. 遗传算法 一. 爬山算法 ( Hill Climbing ) 介绍模拟退火前,先介绍爬山算法.爬山算法是一种简单的贪心搜索算法,该算法每次从当前解的临近解空间中选择一个最优解作为当前解,直到达到一个局部最优解. 爬山算法实现很简单,其主要缺点是会陷入局部最优解,而不一定能搜索到全局最优解.如图1所示:假设C点为当前解,爬山算法搜索到A点这个局部最优解就会停止搜索,因为在A点无论向那个方向小幅度移动都不能得到更优的解. 图1    

模拟退火算法解析

一. 爬山算法 ( Hill Climbing ) 介绍模拟退火前,先介绍爬山算法.爬山算法是一种简单的贪心搜索算法,该算法每次从当前解的临近解空间中选择一个最优解作为当前解,直到达到一个局部最优解. 爬山算法实现很简单,其主要缺点是会陷入局部最优解,而不一定能搜索到全局最优解.如图1所示:假设C点为当前解,爬山算法搜索到A点这个局部最优解就会停止搜索,因为在A点无论向那个方向小幅度移动都不能得到更优的解. 图1     二. 模拟退火(SA,Simulated Annealing)思想 爬山法