Advertisement
cmiN

TSHPATH

Jun 12th, 2011
339
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.67 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define inf 0xffFFffFF
  5. #define N 10001
  6.  
  7. short nodes, paths;
  8. short viz[N], ord[N];
  9. unsigned int*** list, dist[N];
  10. char name[N][11];
  11.  
  12. inline int cmp(const void* a, const void* b)
  13. {
  14.     return strcmp(name[*((const short*)a)], name[*((const short*)b)]);
  15. }
  16.  
  17. short getindex(const char* string)
  18. {
  19.     short lo = 1, hi = nodes, mid, res;
  20.     while (lo <= hi) {
  21.         mid = (lo + hi) / 2;
  22.         res = strcmp(string, name[ord[mid]]);
  23.         if (!res) {
  24.             return ord[mid];
  25.         } else if (res > 0) {
  26.             lo = mid + 1;
  27.         } else {
  28.             hi = mid - 1;
  29.         }
  30.     }
  31.     return 0;
  32. }
  33.  
  34. void read()
  35. {
  36.     short i, j, nbs, nb;
  37.     unsigned int cst;
  38.     char tmp[11];
  39.     scanf("%hd", &nodes);
  40.     list = (unsigned int***) malloc((nodes + 1) * sizeof(unsigned int**));
  41.     for (i = 1; i <= nodes; ++i) {
  42.         scanf("%s\n%hd", name[i], &nbs);
  43.         ord[i] = i;
  44.         list[i] = (unsigned int**) malloc((nbs + 1) * sizeof(unsigned int*));
  45.         list[i][0] = (unsigned int*) malloc(sizeof(unsigned int));
  46.         list[i][0][0] = nbs;
  47.         for (j = 1; j <= nbs; ++j) {
  48.             scanf("%hd %u", &nb, &cst);
  49.             list[i][j] = (unsigned int*) malloc(2 * sizeof(unsigned int));
  50.             list[i][j][0] = nb;
  51.             list[i][j][1] = cst;
  52.         }
  53.     }
  54.     qsort(ord + 1, nodes, sizeof(short), cmp);
  55.     scanf("%hd", &paths);
  56. }
  57.  
  58. void process()
  59. {
  60.     short i, j, src, dest, var, flag;
  61.     unsigned int min;
  62.     char tmp[11];
  63.     for (i = 0; i < paths; ++i) {
  64.         scanf("%s", tmp);
  65.         src = getindex(tmp);
  66.         scanf("%s", tmp);
  67.         dest = getindex(tmp);
  68.         memset(viz, 0, (nodes + 1) * sizeof(short));
  69.         memset(dist, 0xFF, (nodes + 1) * sizeof(unsigned int));
  70.         dist[src] = 0;
  71.         var = src;
  72.         do {
  73.             viz[var] = 1;
  74.             for (j = 1; j <= list[var][0][0]; ++j) {
  75.                 if (dist[var] + list[var][j][1] < dist[list[var][j][0]]) {
  76.                     dist[list[var][j][0]] = dist[var] + list[var][j][1];
  77.                 }
  78.             }
  79.             flag = 0;
  80.             min = inf;
  81.             for (j = 1; j <= nodes; ++j) {
  82.                 if (!viz[j] && dist[j] < min) {
  83.                     min = dist[j];
  84.                     var = j;
  85.                     flag = 1;
  86.                 }
  87.             }
  88.         } while (flag);
  89.         printf("%u\n", dist[dest]);
  90.     }
  91. }
  92.  
  93. int main()
  94. {
  95.     short tests;
  96.     //freopen("shpath.in", "rt", stdin);
  97.     for (scanf("%hd", &tests); tests; --tests) {
  98.         read();
  99.         process();
  100.         free(list);
  101.     }
  102.     return 0;
  103. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement