双调旅行员售货问题C语言 用txt文件输入输出
时间: 2024-03-26 21:35:07 浏览: 13
以下代码实现了双调旅行员售货问题的解决方法,并使用了 txt 文件进行输入输出。
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXN 1000
#define INF 0x3f3f3f3f
int n; // 城市数量
int dist[MAXN][MAXN]; // 距离矩阵
int dp[MAXN][MAXN]; // 动态规划数组
int path[MAXN][MAXN]; // 路径记录数组
int cmp(const void *a, const void *b) {
return *(int *)a - *(int *)b;
}
int main() {
FILE *fp = fopen("input.txt", "r");
fscanf(fp, "%d", &n);
// 读入距离矩阵
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
fscanf(fp, "%d", &dist[i][j]);
}
}
fclose(fp);
// 初始化动态规划数组
memset(dp, INF, sizeof(dp));
dp[1][1] = 0;
// 动态规划
for (int i = 2; i <= n; i++) {
for (int j = 1; j <= i - 1; j++) {
for (int k = 1; k <= j; k++) {
int cost = dist[k][i] + dp[j][k];
if (cost < dp[i][j]) {
dp[i][j] = cost;
path[i][j] = k;
}
}
}
}
// 找到最小距离
int ans = INF;
int k = 1;
for (int j = 1; j < n; j++) {
if (dp[n][j] + dist[j][n] < ans) {
ans = dp[n][j] + dist[j][n];
k = j;
}
}
// 输出路径
int p = n;
int q = k;
int route[MAXN];
int len = 0;
while (p > 1 || q > 1) {
route[len++] = p;
p = q;
q = path[p][q];
}
route[len++] = 1;
// 反转路径
qsort(route, len, sizeof(int), cmp);
// 输出路径到文件
fp = fopen("output.txt", "w");
for (int i = 0; i < len; i++) {
fprintf(fp, "%d ", route[i]);
}
fprintf(fp, "\n");
// 输出最小距离到文件
fprintf(fp, "%d\n", ans);
fclose(fp);
return 0;
}
```
在此代码中,程序首先从 `input.txt` 文件中读入城市数量和距离矩阵,然后进行动态规划求解。最后,程序将结果输出到 `output.txt` 文件中。