Advertisement
magneto903

wasm_left_field

Mar 23rd, 2021
181
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.61 KB | None | 0 0
  1. #include <stdio.h>
  2.  
  3. int edges_start[3000];
  4. int edges_end[3000];
  5. float edges_len[3000];
  6.  
  7. int g_links_id[1000][100];
  8. float g_links_weight[1000][100];
  9.  
  10. int cache_id[1000];
  11. float cache_distance[1000];
  12. int cache_prev[1000];
  13. int cache_links_id[1000][100];
  14. float cache_links_weight[1000][100];
  15.  
  16. int queue_id[1000];
  17. float queue_distance[1000];
  18. int queue_prev[1000];
  19. int queue_links_id[1000][100];
  20. float queue_links_weight[1000][100];
  21.  
  22. void* memcpy(char* dst, char* src, int count) {
  23.   while(count--) *dst++ = *src++;
  24. }
  25.  
  26.  
  27. void init_cpp() {
  28.   for (int i=0; i < 1000; i++) {
  29.     cache_id[i] = -2;
  30.     queue_id[i] = -2;
  31.     cache_distance[i] =  100000;
  32.     queue_distance[i] = 100000;
  33.     cache_prev[i] = -2;
  34.     queue_prev[i] = -2;
  35.     for (int j=0; j < 100; j++) {
  36.       queue_links_id[i][j] = -2;
  37.       queue_links_weight[i][j] = 100000;
  38.       cache_links_id[i][j] = -2;
  39.       cache_links_weight[i][j] = 100000;
  40.     }
  41.   }
  42. }
  43.  
  44. void init_edges_cpp() {
  45.   for (int i=0; i < 3000; i++) {
  46.     edges_start[i] = -2;
  47.     edges_end[i] = -2;
  48.     edges_len[i] = -2.0;
  49.   }
  50.  
  51.   for (int i=0; i < 1000; i++) {
  52.     for (int j=0; j < 100; j++) {
  53.       g_links_id[i][j] = -2;
  54.       g_links_weight[i][j] = -2.0;
  55.     }
  56.   }
  57. }
  58.  
  59. void add_edge_cpp(int index, int start, int end, float len) {
  60.   edges_start[index] = start;
  61.   edges_end[index] = end;
  62.   edges_len[index] = len;
  63. }
  64.  
  65. void fill_graph_cpp() {
  66.   for (int i=0; i < 3000; i++) {
  67.     int s = edges_start[i];
  68.     int e = edges_end[i];
  69.     float len = edges_len[i];
  70.  
  71.     if (s == -2) {
  72.       break;
  73.     }
  74.  
  75.     int links_len = 0;
  76.  
  77.     for (int j=0; j < 100; j++) {
  78.       if (g_links_id[s][j] == -2) {
  79.         links_len = j;
  80.         break;
  81.       }
  82.     }
  83.  
  84.     g_links_id[s][links_len] = e;
  85.     g_links_weight[s][links_len] = len;
  86.  
  87.     for (int j=0; j < 100; j++) {
  88.       if (g_links_id[e][j] == -2) {
  89.         links_len = j;
  90.         break;
  91.       }
  92.     }
  93.     g_links_id[e][links_len] = s;
  94.     g_links_weight[e][links_len] = len;
  95.   }
  96. }
  97.  
  98.  
  99. void get_dists_cpp(int a, int L) {
  100.  
  101.  
  102.     int i = L;
  103.     while (--i >= 0) {
  104.        
  105.        
  106.         for (int j = 0; j < 100; j++) {
  107.             //console.log()
  108.             if (g_links_id[i][j] == -2) {
  109.                 break;
  110.             }
  111.             cache_links_id[i][j] = g_links_id[i][j];
  112.             cache_links_weight[i][j] = g_links_weight[i][j];
  113.         }
  114.  
  115.         cache_id[i] = i;
  116.     }
  117.  
  118.  
  119.     queue_id[0] = cache_id[a];
  120.     cache_distance[a] = 0;
  121.     queue_distance[0] = cache_distance[a];
  122.     queue_prev[0] = queue_prev[a];
  123.     for (int j=0; j < 100; j++) {
  124.         queue_links_id[0][j] = cache_links_id[a][j];
  125.         queue_links_weight[0][j] = cache_links_weight[a][j];
  126.     }
  127.    
  128.  
  129.    
  130.     i=0;
  131.     int queue_len = 1;
  132.     while (i < queue_len) {
  133.         int node_id = queue_id[i];
  134.         float node_distance = queue_distance[i];
  135.         int node_prev = queue_prev[i];
  136.  
  137.         int j=0;
  138.         for (int k=0; k < 100; k++) {
  139.             if (queue_links_id[i][k] == -2) {
  140.                 j=k;
  141.                 break;
  142.             }
  143.         }
  144.  
  145.         while (--j >= 0) {
  146.             int link_id = queue_links_id[i][j];
  147.             float link_weight = queue_links_weight[i][j];
  148.  
  149.             int c_id = cache_id[link_id];
  150.             float c_distance = cache_distance[link_id];
  151.             int c_prev = cache_prev[link_id];
  152.  
  153.             float d = node_distance + link_weight;
  154.             if (d < c_distance) {
  155.                 cache_prev[link_id] = node_id;
  156.                 cache_distance[link_id] = d;
  157.  
  158.                 int last_ind = queue_len;
  159.                 queue_id[last_ind] = cache_id[link_id];
  160.                 queue_distance[last_ind] = cache_distance[link_id];
  161.  
  162.                 for (int k=0; k < 100; k++) {
  163.                     if (cache_links_id[link_id][k] == -2) {
  164.                         break;
  165.                     }
  166.                    
  167.             queue_links_id[last_ind][k] = cache_links_id[link_id][k];
  168.             queue_links_weight[last_ind][k] = cache_links_weight[link_id][k];
  169.           }
  170.           queue_prev[last_ind] = cache_prev[link_id];
  171.           queue_len++;
  172.             }
  173.  
  174.         }
  175.         i++;
  176.     }
  177.  
  178. }
  179.  
  180. int get_edges_start(int index) {
  181.   return edges_start[index];
  182. }
  183.  
  184. float get_cache_distance(int index) {
  185.     return cache_distance[index];
  186. }
  187.  
  188. int get_cache_prev(int index) {
  189.     return cache_prev[index];
  190. }
  191.  
  192.  
  193.  
  194. int main() {
  195.     init_edges_cpp();
  196.     init_cpp();
  197.     add_edge_cpp(0, 0, 2, 1);
  198.     add_edge_cpp(1, 0, 1, 1);
  199.     add_edge_cpp(2, 1, 2, 1);
  200.     add_edge_cpp(3, 2, 3, 1);
  201.     add_edge_cpp(4, 2, 4, 1);
  202.     add_edge_cpp(5, 3, 4, 1);
  203.     fill_graph_cpp();
  204.    
  205.     get_dists_cpp(0, 5);
  206.     /*
  207.     for (int i=0; i < 10; i++) {
  208.         cout << i << " " << get_cache_distance(i) << " " << get_cache_prev(i) << endl;
  209.     }
  210.     */
  211.    
  212.     return 0;
  213. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement