Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- int edges_start[3000];
- int edges_end[3000];
- float edges_len[3000];
- int g_links_id[1000][100];
- float g_links_weight[1000][100];
- int cache_id[1000];
- float cache_distance[1000];
- int cache_prev[1000];
- int cache_links_id[1000][100];
- float cache_links_weight[1000][100];
- int queue_id[1000];
- float queue_distance[1000];
- int queue_prev[1000];
- int queue_links_id[1000][100];
- float queue_links_weight[1000][100];
- void* memcpy(char* dst, char* src, int count) {
- while(count--) *dst++ = *src++;
- }
- void init_cpp() {
- for (int i=0; i < 1000; i++) {
- cache_id[i] = -2;
- queue_id[i] = -2;
- cache_distance[i] = 100000;
- queue_distance[i] = 100000;
- cache_prev[i] = -2;
- queue_prev[i] = -2;
- for (int j=0; j < 100; j++) {
- queue_links_id[i][j] = -2;
- queue_links_weight[i][j] = 100000;
- cache_links_id[i][j] = -2;
- cache_links_weight[i][j] = 100000;
- }
- }
- }
- void init_edges_cpp() {
- for (int i=0; i < 3000; i++) {
- edges_start[i] = -2;
- edges_end[i] = -2;
- edges_len[i] = -2.0;
- }
- for (int i=0; i < 1000; i++) {
- for (int j=0; j < 100; j++) {
- g_links_id[i][j] = -2;
- g_links_weight[i][j] = -2.0;
- }
- }
- }
- void add_edge_cpp(int index, int start, int end, float len) {
- edges_start[index] = start;
- edges_end[index] = end;
- edges_len[index] = len;
- }
- void fill_graph_cpp() {
- for (int i=0; i < 3000; i++) {
- int s = edges_start[i];
- int e = edges_end[i];
- float len = edges_len[i];
- if (s == -2) {
- break;
- }
- int links_len = 0;
- for (int j=0; j < 100; j++) {
- if (g_links_id[s][j] == -2) {
- links_len = j;
- break;
- }
- }
- g_links_id[s][links_len] = e;
- g_links_weight[s][links_len] = len;
- for (int j=0; j < 100; j++) {
- if (g_links_id[e][j] == -2) {
- links_len = j;
- break;
- }
- }
- g_links_id[e][links_len] = s;
- g_links_weight[e][links_len] = len;
- }
- }
- void get_dists_cpp(int a, int L) {
- int i = L;
- while (--i >= 0) {
- for (int j = 0; j < 100; j++) {
- //console.log()
- if (g_links_id[i][j] == -2) {
- break;
- }
- cache_links_id[i][j] = g_links_id[i][j];
- cache_links_weight[i][j] = g_links_weight[i][j];
- }
- cache_id[i] = i;
- }
- queue_id[0] = cache_id[a];
- cache_distance[a] = 0;
- queue_distance[0] = cache_distance[a];
- queue_prev[0] = queue_prev[a];
- for (int j=0; j < 100; j++) {
- queue_links_id[0][j] = cache_links_id[a][j];
- queue_links_weight[0][j] = cache_links_weight[a][j];
- }
- i=0;
- int queue_len = 1;
- while (i < queue_len) {
- int node_id = queue_id[i];
- float node_distance = queue_distance[i];
- int node_prev = queue_prev[i];
- int j=0;
- for (int k=0; k < 100; k++) {
- if (queue_links_id[i][k] == -2) {
- j=k;
- break;
- }
- }
- while (--j >= 0) {
- int link_id = queue_links_id[i][j];
- float link_weight = queue_links_weight[i][j];
- int c_id = cache_id[link_id];
- float c_distance = cache_distance[link_id];
- int c_prev = cache_prev[link_id];
- float d = node_distance + link_weight;
- if (d < c_distance) {
- cache_prev[link_id] = node_id;
- cache_distance[link_id] = d;
- int last_ind = queue_len;
- queue_id[last_ind] = cache_id[link_id];
- queue_distance[last_ind] = cache_distance[link_id];
- for (int k=0; k < 100; k++) {
- if (cache_links_id[link_id][k] == -2) {
- break;
- }
- queue_links_id[last_ind][k] = cache_links_id[link_id][k];
- queue_links_weight[last_ind][k] = cache_links_weight[link_id][k];
- }
- queue_prev[last_ind] = cache_prev[link_id];
- queue_len++;
- }
- }
- i++;
- }
- }
- int get_edges_start(int index) {
- return edges_start[index];
- }
- float get_cache_distance(int index) {
- return cache_distance[index];
- }
- int get_cache_prev(int index) {
- return cache_prev[index];
- }
- int main() {
- init_edges_cpp();
- init_cpp();
- add_edge_cpp(0, 0, 2, 1);
- add_edge_cpp(1, 0, 1, 1);
- add_edge_cpp(2, 1, 2, 1);
- add_edge_cpp(3, 2, 3, 1);
- add_edge_cpp(4, 2, 4, 1);
- add_edge_cpp(5, 3, 4, 1);
- fill_graph_cpp();
- get_dists_cpp(0, 5);
- /*
- for (int i=0; i < 10; i++) {
- cout << i << " " << get_cache_distance(i) << " " << get_cache_prev(i) << endl;
- }
- */
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement