Advertisement
Guest User

old_task_S(wrong)

a guest
Aug 24th, 2019
201
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.72 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <limits.h>
  3.  
  4. #define MAX_LENGTH_ARC 501501
  5. #define MAX_COUNTR_VERTEX 1003
  6.  
  7. typedef struct e{
  8.     int len;
  9.     int towns;
  10. }e;
  11.  
  12. e map[501501];
  13. int last[MAX_COUNTR_VERTEX];
  14. int used[MAX_COUNTR_VERTEX];
  15. int P[MAX_COUNTR_VERTEX];
  16.  
  17. //make "index" from v
  18. int makeIndex(int vert1, int vert2) {
  19.     if (vert1 > vert2) {
  20.         return (vert1 * (vert1 - 1)) / 2 + vert2;
  21.     } else {
  22.         return (vert2 * (vert2 - 1)) / 2 + vert1;
  23.     }
  24. }
  25. void djkstr(int s, int N, int Finish, FILE *output){
  26.     //int k = 0;
  27.     int dist[MAX_COUNTR_VERTEX];
  28.  
  29.     for(int i = 0; i < MAX_COUNTR_VERTEX; i++){
  30.         dist[i] = INT_MAX;
  31.         used[i] = 0;
  32.         last[i] = 0;
  33.     }
  34.     dist[s] = 0;
  35.  
  36.     for(int i = 0; i < MAX_COUNTR_VERTEX; i++){
  37.         int v = -1;
  38.         for(int j = 0; j < MAX_COUNTR_VERTEX; j++){
  39.             if (!used[j] && dist[j] < dist[v]){
  40.                 v = j;
  41.             }
  42.         }
  43.         if(dist[v] == INT_MAX){
  44.             break;
  45.         }
  46.  
  47.         used[v] = 1;
  48.  
  49.         for(int y = 0; y < N; y++){
  50.             int index = makeIndex(v, y);//index (N + 1)*N/2 - (1 + (N - s))*(N - s)/2 + (N - s) - (N - y);
  51.             if(map[index].len != INT_MIN) {//если есть путь, то проводим релаксацию
  52.  
  53.                 int len = map[index].len + P[y];//стоимость перехода +пошлина
  54.  
  55.                 if (dist[v] + len <= dist[y]) {
  56.                     if(dist[v] + len == dist[y]) {
  57.                         if(map[y].towns <= (map[v].towns + 1)){
  58.                             last[y] = v;
  59.                             map[y].towns = map[v].towns + 1;
  60.                         }
  61.                     }
  62.                     else{
  63.                         dist[y] = dist[v] + len;
  64.                         last[y] = v;
  65.                         map[y].towns = map[v].towns + 1;
  66.                     }
  67.                 }
  68.             }
  69.         }
  70.     }
  71.     int count;
  72.     int buff = Finish;
  73.     while(buff != s){
  74.         fprintf(output,"%d\n", last[buff]);
  75.         buff = last[buff];
  76.     }
  77.     fprintf(output,"%d", s);
  78.  
  79. }
  80.  
  81. int main() {
  82.     //бфс с очередями с приоритетами
  83.     for(int i = 0; i < 501000; i++){
  84.         map[i].len = -1;
  85.         map[i].towns = -1;
  86.     }
  87.  
  88.     FILE * input = fopen("input.txt","r");
  89.     FILE * output = fopen("output.txt","w");
  90.  
  91.     int N = 0;
  92.     fscanf(input,"%d\n", &N);
  93.     for(int i = 0; i < N; i++) {
  94.         fscanf(input, "%d",&P[i]);
  95.     }
  96.     fscanf(input,"\n");
  97.     fscanf(input," \n");
  98.  
  99.     int M = 0;
  100.     int index = 0;
  101.     fscanf(input,"%d",&M);
  102.     for(int i = 0; i < M; i++){
  103.         int x, y, w;
  104.         fscanf(input, "%d %d %d\n", &x, &y, &w);
  105.         if(y > x){
  106.             x = x + y;//swap
  107.             y = x - y;
  108.             x = x - y;
  109.         }
  110.         index = makeIndex(x, y);
  111.  
  112.         //Map[(N + 1)*N/2 - (1 + (N - x))*(N - x)/2 + (N - x) - (N - y)].len = w;//Map[x][y] = w;//(N + 1)*N/2 - (1 + (N - x))*(N - x)/2 + (N - x) - (N - y);
  113.         //Map[(N + 1)*N/2 - (1 + (N - x))*(N - x)/2 + (N - x) - (N - y)].to = y;
  114.         map[index].len = w;
  115.     }
  116.     fscanf(input, "\n");
  117.  
  118.     int Start, Finish;
  119.     fscanf(input, "%d %d", &Start, &Finish);
  120.  
  121.     djkstr(Start, N, Finish, output);
  122.  
  123.     //for(int y = 0; y < 1001; y++){
  124.     //    for(int x = y + 1; x < 1001; x++){
  125.   //          if(Map[x][y] != NULL){
  126. //
  127.         //    }
  128.       //  }
  129.     //}
  130.     //(n+1)*n/2 - (1+(n-l))*(n-l)/2 + (n-l)-(n-r)
  131.     //для 3,4 : 15 - 3 + 2 - 1 = 13;
  132.     //n - кол-во вершин
  133.     //l, r - ака координаты
  134.     //если л > r нужно поменять местами
  135.     fclose(input);
  136.     fclose(output);
  137.     return 0;
  138. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement