|  | 
|  | 
| back to board | Whi 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;
 }
 | 
 | 
|