hdu 1385 Minimum Transport Cost
BFS注意字典序的问题。WA了好多发。
#include<stdio.h> #include<math.h> #include<string.h> #include<vector> #include<algorithm> using namespace std; const int maxn = 70; int n, cost[maxn][maxn],bb[maxn], ji[maxn]; struct abc{ int node, fei; int ans[maxn]; int q = 0; }dt[90000]; int main() { int i, j, k, ans; while (~scanf("%d", &n)) { if (n == 0) break; for (i = 1; i <= n; i++) for (j = 1; j <= n; j++) scanf("%d", &cost[i][j]); for (i = 1; i <= n; i++) scanf("%d", &bb[i]); int st, et; while (1) { scanf("%d%d", &st, &et); if (st == -1 && et == -1) break; if (st == et) { printf("From %d to %d :\n", st, et); printf("Path: %d\n",st); printf("Total cost : %d\n", 0); printf("\n"); } else { for (i = 0; i < maxn; i++) ji[i] = 999999999; int b = 0; dt[0].node = st; dt[0].fei = 0; dt[0].ans[0] = st; dt[0].q = 1; ji[st] = 0; int minn = 999999999; for (i = 0; i <= b; i++) { for (j = 1; j <= n; j++) { if (cost[dt[i].node][j] != -1 && dt[i].node != j) { if (j == et) { if (dt[i].fei + cost[dt[i].node][j] <= ji[j]) { ji[j] = dt[i].fei + cost[dt[i].node][j]; b++; minn = dt[i].fei + cost[dt[i].node][j]; dt[b].q = dt[i].q + 1; dt[b].fei = dt[i].fei + cost[dt[i].node][j]; dt[b].node = j; for (k = 0; k < dt[b].q; k++) { if (k < dt[b].q - 1)dt[b].ans[k] = dt[i].ans[k]; else if (k == dt[b].q - 1) dt[b].ans[k] = j; } } } else if (j != et) { if (dt[i].fei + cost[dt[i].node][j] + bb[j] <= ji[j]) { ji[j] = dt[i].fei + cost[dt[i].node][j] + bb[j]; b++; dt[b].q = dt[i].q + 1; dt[b].node = j; dt[b].fei = dt[i].fei + cost[dt[i].node][j] + bb[j]; for (k = 0; k < dt[b].q; k++) { if (k < dt[b].q - 1)dt[b].ans[k] = dt[i].ans[k]; else if (k == dt[b].q - 1) dt[b].ans[k] = j; } } } } } } int kk; char s[1000]; s[0] = 'z'; s[1] = 'z'; s[2] = '\0'; char k[1000]; for (i = 0; i <= b; i++) { if (dt[i].fei == ji[et]&&dt[i].ans[dt[i].q-1]==et) { for (kk = 0; kk < dt[i].q; kk++) k[kk] = dt[i].ans[kk]; k[dt[i].q] = 0; if (strcmp(s, k)>0) { strcpy(s, k); ans = i; } } } printf("From %d to %d :\n", st, et); printf("Path: "); for (i = 0; i < dt[ans].q; i++) { if (i < dt[ans].q - 1) printf("%d-->", dt[ans].ans[i]); else printf("%d\n", dt[ans].ans[i]); } printf("Total cost : %d\n", dt[ans].fei); printf("\n"); } } } return 0; }