UVA 1424 - Salesmen
给出一副图,并且给出nhn走过的路径记入,路径可能是错的,问最少修改几个地方可以使得路径是正确的。
dp[i][j] 表示修改第i个位置为j点的前i个位置的最小修改次数。
dp[i][j] = min(dp[i-1][k] + (j == a[i])); {w[k][j] == true 即存在路径k~j}
然后再最后一个点找一个最小值。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int INF = 999999999;
int n, m, k;
bool c[105][105];
int a, b;
int s[205];
int dp[205][105];
int main () {
int T;
for (scanf("%d", &T); T>0; T--) {
scanf ("%d%d", &n, &m);
memset(c, false, sizeof(c));
for (int i=0; i<m; i++) {
scanf("%d%d", &a, &b);
c[a][b] = c[b][a] = true;
}
for (int i=1; i<=n; i++) {
c[i][i] = true;
}
scanf ("%d", &k);
for (int i=1; i<=k; ++i) {
scanf("%d", &s[i]);
}
for (int i=1; i<=n; i++) {
dp[1][i] = 1;
}
dp[1][s[1]] = 0;
for (int i=2; i<=k; i++) {
for (int j=1; j<=n; j++) {
if (j== s[i]) continue;
dp[i][j] = INF;
for (int v=1; v<=n; v++) {
if (c[v][j] == true) {
dp[i][j] = min(dp[i][j], dp[i-1][v] + 1);
}
}
}
dp[i][s[i]] = INF;
for (int v=1; v<=n; v++) {
if (c[v][s[i]]) dp[i][s[i]] = min(dp[i][s[i]], dp[i-1][v]);
}
}
int ans = INF;
for (int i=1; i<=n; i++) {
ans = min(ans, dp[k][i]);
}
printf ("%d\n", ans);
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-09-30 21:09:03