状压DP TSP不回到原点
2016-03-31 16:32
471 查看
题目大意:
有N个点,你开始在第一个点,现在要求你不重复的遍历所有点(点经过后不能再次经过),问最短距离是多少。2<=N<=16.
有N个点,你开始在第一个点,现在要求你不重复的遍历所有点(点经过后不能再次经过),问最短距离是多少。2<=N<=16.
M[i][j] <= 1000.输入直到文件结尾。
思路:刚开始知道是状态亚索dp,但是怎么都搞不出来。
代 码里面有注释,应该可有看懂,主要就是枚举所有状态,查看被访问的点,最后找到更有中间点替换。因为起点给定,多以从1开始循环
有N个点,你开始在第一个点,现在要求你不重复的遍历所有点(点经过后不能再次经过),问最短距离是多少。2<=N<=16.
有N个点,你开始在第一个点,现在要求你不重复的遍历所有点(点经过后不能再次经过),问最短距离是多少。2<=N<=16.
Input
首先是一个整数N,表示有N个点,接下来是一个N*N的矩阵M,M[i][j]表示第i个点到第j个点的距离是M[i][j].M[i][j] <= 1000.输入直到文件结尾。
Output
每个结果输出一行。Sample Input
3 0 913 524 913 0 175 524 175 0
Sample Output
699
思路:刚开始知道是状态亚索dp,但是怎么都搞不出来。
代 码里面有注释,应该可有看懂,主要就是枚举所有状态,查看被访问的点,最后找到更有中间点替换。因为起点给定,多以从1开始循环
#include <iostream> #include <cstdio> #include <string> #include <cstring> #include <fstream> #include <algorithm> #include <cmath> #include <queue> #include <stack> #include <vector> #include <map> #include <set> #include <iomanip> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define maxn 100010 #define MOD 1000000007 #define INF 0x3f3f3f3f #define mem(a , b) memset(a , b , sizeof(a)) #define LL long long #define INF 1000000000 int dp[17][(1<<17) + 5]; int mat[17][17]; int n; int main() { while(scanf("%d" , &n)!=EOF) { //mem(dp , 0x3f); for(int i = 0 ; i <= n ; i ++) for(int j = 0 ; j <= (1 << n) ; j ++) dp[i][j] = INF; for(int i = 0 ; i < n ; i ++) { for(int j = 0 ; j < n ; j ++) { scanf("%d" , &mat[i][j]); } } dp[0][1] = 0; // for(int i = 0 ; i < n ; i ++) dp[i][1] = 0; for(int j = 1 ; j < (1 << n ) ; j ++) //状态 { for(int i = 1 ; i < n ; i++) //未被访问的点 { if( !(j & ( 1 << (i)) ))// { for(int k = 0 ; k < n ; k ++) //中间点 { //if(k <= i) continue; if(dp[k][j] != INF) //中间点被访问过 dp[i][j+(1 << (i))] = min(dp[i][j+(1 << (i))] , dp[k][j]+mat[i][k]); } } } } // cout << dp[n-1][(1<<n)-1] << endl; int ans = INF; for(int i = 1 ; i < n ; i ++) ans = min(ans , dp[i][(1<<n)-1]); cout << ans << endl; } return 0; } /* 6 0 15 62 32 15 4 15 0 456 21 35 6 62 456 0 321 12 34 32 21 321 0 123 56 15 35 12 123 0 122 21 6 34 56 122 0 88 */
相关文章推荐
- 雅思考试经验分享,G类移民不可错过!
- kaptcha验证码的简单使用及配置
- 对于锚点和position的理解
- 15电气郄慧敏vb作业,生成10个数
- 作业2
- Delphi对WM_NCHITTEST消息的处理
- 4_3 救济金发放(UVa133)<子过程/函数设计>
- JS面向对象的程序设计
- 最大字段和问题
- update the gedit for php programming(searched not try yet)
- 初探MEAN
- Android发送短信
- 即便到愚人节,也千万别做的恶作剧!
- VB作业1
- 15个数字的排序
- 玩过hadoop,hive的你们可以回顾回顾
- TCP/IP学习笔记:TCP传输控制协议(一)
- CoreData数据库迁移的操作
- hql多条件查询的拼接
- 中级题:二师弟的星际加法