UVA116 Unidirectional TSP 单向TSP
2015-08-13 10:44
447 查看
分阶段的DAG,注意字典序的处理和路径的保存。
定义状态d[i][j]为从i,j 出发到最后一列的最小花费,转移的时候只有三种,向上,向下,或平移。
定义状态d[i][j]为从i,j 出发到最后一列的最小花费,转移的时候只有三种,向上,向下,或平移。
#include<bits/stdc++.h> using namespace std; const int maxm = 11; const int maxn = 101; int G[maxm][maxn]; const int INF = 1e9; int d[maxm][maxn]; int path[maxn][maxn]; int main() { //freopen("in.txt","r",stdin); int m,n; while(~scanf("%d%d",&m,&n)){ for(int i = 0; i < m; i++) for(int j = 0; j < n ;j++){ scanf("%d",G[i]+j); } int ans = INF,head = 0; for(int i = 0; i < m; i++) d[i][n-1] = G[i][n-1]; if(n == 1){ for(int i = 0; i < m; i++){ if(d[i][0]<ans) { ans = d[i][0]; head = i; } } }else { for(int j = n-2; j >= 0; j--){ for(int i = 0; i < m; i++){ int nxt[] = {i,i+1,i-1}; if(i == 0) nxt[2] = m-1; if(i == m-1) nxt[1] = 0; sort(nxt,nxt+3); d[i][j] = d[nxt[0]][j+1]; path[i][j] = nxt[0]; for(int k = 1; k < 3; k++){ int t = d[nxt[k]][j+1]; if(t < d[i][j]){ d[i][j] = t; path[i][j] = nxt[k]; } } d[i][j] += G[i][j]; if(j == 0 && d[i][j] < ans) { ans = d[i][j]; head = i; } } } } printf("%d",head+1); for(int i = path[head][0],j = 1; j < n; i = path[i][j], j++){ printf(" %d",i+1); } printf("\n%d\n",ans); } return 0; }
相关文章推荐
- 浏览器卡死 (但是内存还不到一半)
- C/C++之单例模式实现
- ◆JAVA加密解密-3DES
- hdu 3416 Marriage Match IV 【 最短路 最大流 】
- sql储存过程in(多个参数)
- JS 通过正则表达式获取URL中的参数
- Android eclipse 提示java代码 快捷键
- mysql ERROR 1045 (28000): Access denied for user解决方法
- 董明珠:二代格力手机不拼小米拼苹果
- 前缀表达式,后缀表达式
- char/byte/short类型的加法和类型转换问题
- 使用DES方法,对字符串进行加密
- MSYS2的源配置
- 百度编辑器图片在线流量返回url修改
- 【基础练习】【背包DP】codevs1068 乌龟棋题解
- 在线预览pdf
- 将代码view和xibview放到SB中
- 联想笔记本官网驱动下载
- grunt
- openwrt网络配置(有线,无线)