热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

POJ3311HiewiththePie:TSP(旅行商)【节点可多次经过】

题目链接:http:poj.orgproblem?id3311题意:你在0号点(pizza店),要往1到n号节

题目链接:http://poj.org/problem?id=3311

题意:

  你在0号点(pizza店),要往1到n号节点送pizza。

  每个节点可以重复经过。

  给你一个(n+1)*(n+1)的邻接矩阵,表示各点之间距离。

  问你送完所有pizza再返回店里的最短路程。

 

题解:

  与传统TSP相比,唯一变化的条件是每个节点可以经过多次。

  所以也就是转移的时候不用再判断要去的节点j是否去过。

  先floyd预处理出两点之间最短路。然后把(!((state>>j)&1))去掉,套TSP模板就好啦。

 

AC Code:

1 #include
2 #include
3 #include <string.h>
4 #include
5 #define MAX_N 15
6 #define MAX_S (1<<13)
7 #define INF 10000000
8
9 using namespace std;
10
11 int n;
12 int ans;
13 int dp[MAX_S][MAX_N];
14 int dis[MAX_N][MAX_N];
15
16 void floyd()
17 {
18 for(int k&#61;0;k<&#61;n;k&#43;&#43;)
19 {
20 for(int i&#61;0;i<&#61;n;i&#43;&#43;)
21 {
22 for(int j&#61;0;j<&#61;n;j&#43;&#43;)
23 {
24 if(i!&#61;j && j!&#61;k && i!&#61;k)
25 {
26 dis[i][j]&#61;min(dis[i][j],dis[i][k]&#43;dis[k][j]);
27 }
28 }
29 }
30 }
31 }
32
33 void read()
34 {
35 for(int i&#61;0;i<&#61;n;i&#43;&#43;)
36 {
37 for(int j&#61;0;j<&#61;n;j&#43;&#43;)
38 {
39 cin>>dis[i][j];
40 }
41 }
42 }
43
44 void solve()
45 {
46 floyd();
47 memset(dp,-1,sizeof(dp));
48 dp[0][0]&#61;0;
49 for(int state&#61;0;state<(1<<(n&#43;1));state&#43;&#43;)
50 {
51 for(int i&#61;0;i<&#61;n;i&#43;&#43;)
52 {
53 if(dp[state][i]!&#61;-1)
54 {
55 for(int j&#61;0;j<&#61;n;j&#43;&#43;)
56 {
57 if(dp[state|(1<1 || dp[state|(1<dp[state][i]&#43;dis[i][j])
58 {
59 dp[state|(1<dis[i][j];
60 }
61 }
62 }
63 }
64 }
65 ans&#61;INF;
66 for(int i&#61;0;i<&#61;n;i&#43;&#43;)
67 {
68 if(dp[(1<<(n&#43;1))-1][i]!&#61;-1)
69 {
70 ans&#61;min(ans,dp[(1<<(n&#43;1))-1][i]&#43;dis[i][0]);
71 }
72 }
73 }
74
75 void print()
76 {
77 cout<endl;
78 }
79
80 int main()
81 {
82 while(cin>>n)
83 {
84 if(n&#61;&#61;0) break;
85 read();
86 solve();
87 print();
88 }
89 }

 

转:https://www.cnblogs.com/Leohh/p/7382781.html



推荐阅读
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • 题目Link题目学习link1题目学习link2题目学习link3%%%受益匪浅!-----&# ... [详细]
  • 本文详细探讨了KMP算法中next数组的构建及其应用,重点分析了未改良和改良后的next数组在字符串匹配中的作用。通过具体实例和代码实现,帮助读者更好地理解KMP算法的核心原理。 ... [详细]
  • 本题探讨了一种字符串变换方法,旨在判断两个给定的字符串是否可以通过特定的字母替换和位置交换操作相互转换。核心在于找到这些变换中的不变量,从而确定转换的可能性。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • This document outlines the recommended naming conventions for HTML attributes in Fast Components, focusing on readability and consistency with existing standards. ... [详细]
  • 本文介绍了在Windows环境下使用pydoc工具的方法,并详细解释了如何通过命令行和浏览器查看Python内置函数的文档。此外,还提供了关于raw_input和open函数的具体用法和功能说明。 ... [详细]
  • 本文探讨了 C++ 中普通数组和标准库类型 vector 的初始化方法。普通数组具有固定长度,而 vector 是一种可扩展的容器,允许动态调整大小。文章详细介绍了不同初始化方式及其应用场景,并提供了代码示例以加深理解。 ... [详细]
  • 本文基于刘洪波老师的《英文词根词缀精讲》,深入探讨了多个重要词根词缀的起源及其相关词汇,帮助读者更好地理解和记忆英语单词。 ... [详细]
  • 本文介绍如何使用 NSTimer 实现倒计时功能,详细讲解了初始化方法、参数配置以及具体实现步骤。通过示例代码展示如何创建和管理定时器,确保在指定时间间隔内执行特定任务。 ... [详细]
author-avatar
刘志樺伟宇佳君
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有