|
|
back to boardWhi wrang P1004 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXN 100 #define INF 4000000L int n, m; unsigned long int (*d)[MAXN], (*q)[MAXN]; int main(void) { FILE *f, *g; int i, j, k; int x, y; unsigned long int z, z0; d = malloc(sizeof(long int) * MAXN * MAXN); q = malloc(sizeof(long int) * MAXN * MAXN); if (!d || !q) return 1; f = fopen("trip.in", "r"); if (!f || fscanf(f, "%d%d", &n, &m) != 2) return 1; for(i=0; i<n; i++) for(j=0; j<n; j++) d[i][j] = q[i][j] = INF; for(i=0; i<m; i++) { fscanf(f, "%d%d%ld", &x, &y, &z); x--, y--; if (d[x][y] > z && x != y) d[x][y] = d[y][x] = z; } fclose(f); z = INF; x = y = 0; for(i=0; i<n; i++) { q[i][i] = 0; for(j=0; j<i; j++) for(k=0; k<i; k++) // staci od k=j+1 testovat if (j != k) { z0 = q[j][k] + d[i][j] + d[i][k]; if (z0 < z) { z = z0; x = i; y = j; } } for(j=0; j<i; j++) { q[i][j] = INF; // Uz je nastaveno ! for(k=0; k<i; k++) if (q[i][j] > q[j][k] + d[k][i]) q[i][j] = q[j][k] + d[k][i]; q[j][i] = q[i][j]; } for(j=0; j<i; j++) for(k=0; k<i; k++) if (q[j][k] > q[j][i] + q[i][k]) q[j][k] = q[j][i] + q[i][k]; } d[x][y] = d[y][x] = INF; memcpy(q, d, sizeof(long int)*MAXN*MAXN); // memcpy(q, d, sizeof(q)); // Tohle snad ne!! for(i=0; i<n; i++) q[i][i] = 0; for(i=0; i<n; i++) for(j=0; j<n; j++) for(k=0; k<n; k++) if (q[j][k] > q[j][i] + q[i][k]) q[j][k] = q[j][i] + q[i][k]; g = fopen("trip.out", "w"); if (!g) return 2; if (z == INF) fprintf(g, "No solution.\n"); else { while (x != y) { fprintf(g, "%d ", y+1); for(i=0; i<n; i++) if (q[y][x] == q[i][x] + d[y][i]) { y = i; break; } } fprintf(g, "%d\n", x+1); } fclose(g); return 0; } |
|
|