例题9-4 单向TSP(Unidirectional TSP, UVa 116)

来源:互联网 发布:ubuntu vmdk 下载 编辑:程序博客网 时间:2024/05/16 09:15
#include <set>#include <map>#include <ctime>#include <cmath>#include <stack>#include <queue>#include <deque>#include <cstdio>#include <string>#include <vector>#include <cctype>#include <sstream>#include <utility>#include <cstring>#include <cstdlib>#include <functional>#include <iostream>#include <algorithm>#define SF(a) scanf("%d", &a)#define PF(a) printf("%d\n", a)  #define SFF(a, b) scanf("%d%d", &a, &b)  #define SFFF(a, b, c) scanf("%d%d%d", &a, &b, &c)#define SFFFF(a, b, c, d) scanf("%d%d%d%d", &a, &b, &c, &d)#define CLEAR(a, b) memset(a, b, sizeof(a))#define IN() freopen("in.txt", "r", stdin)#define OUT() freopen("out.txt", "w", stdout)#define FOR(i, a, b) for(int i = a; i < b; ++i)#define LL long long#define mod 10007#define inf 100000007#define eps 1e-12using namespace std;int buf[20];int read() {int x = 0; char ch = getchar(); bool f = 0;while (ch < '0' || ch > '9') { if (ch == '-') f = 1; ch = getchar(); }while (ch >= '0' && ch <= '9') x = (x << 1) + (x << 3) + (ch ^ 48), ch = getchar();return f ? -x : x;}void write(int x) {if (!x) { putchar(48); return; }int l = 0; if (x < 0) putchar('-'), x = -x;while (x) buf[++l] = x % 10, x = x / 10;while (l) putchar(buf[l--] + 48);}//-------------------------chc------------------------------//const int maxn = 15;const int maxm = 105;int a[maxn][maxm], dp[maxn][maxm], nxt[maxn][maxm];int main() {int n, m;while (~SFF(n, m) && n) {FOR(i, 0, n) FOR(j, 0, m) {a[i][j] = read();}int ans = inf, sta;for (int j = m - 1; j >= 0; --j) {FOR(i, 0, n) {if (j < m - 1) {int row[] = { i - 1, i, i + 1 };if (i == 0) row[0] = n - 1;if (i == n - 1) row[2] = 0;sort(row, row + 3);dp[i][j] = inf;FOR(k, 0, 3) {int cur = dp[row[k]][j + 1];if (cur < dp[i][j])dp[i][j] = cur, nxt[i][j] = row[k];}dp[i][j] += a[i][j];}else dp[i][j] = a[i][j];if (j == 0 && dp[i][j] < ans) {ans = dp[i][j], sta = i;}}}printf("%d", sta + 1);for (int i = nxt[sta][0], j = 1; j < m; i = nxt[i][j], ++j)printf(" %d", i + 1);printf("\n%d\n", ans);}return 0;}

原创粉丝点击