Advertisement
Guest User

Untitled

a guest
Jul 23rd, 2018
199
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.22 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. #define EPS (0.0000001)
  5. #define N (1004)
  6. #define OUT_N (11)
  7.  
  8. typedef struct rect{
  9.     double data;
  10.     int ind;
  11. }rect_t;
  12.  
  13. rect_t W[N][OUT_N];
  14. int in_v[N], out_v[N];
  15. int IND[N];
  16.  
  17. double vec[N][N / 2 + 4];
  18.  
  19. int vecIndToW[N];
  20. int n, m;
  21.  
  22. /*
  23. void PrintM(FILE *out){
  24.     for(int i = 0; i < n; i++){
  25.         for(int j = 0; j <= n / 2 + 2; j++){
  26.             fprintf(out, "%lf ", vec[i][j]);
  27.         }
  28.         fprintf(out, "\n");
  29.     }
  30.     fprintf(out,"\n");
  31.     fflush(out);
  32. }
  33.  
  34. void PrintMIND(FILE *out, int mk){
  35.     for(int i = 0; i < mk; i++){
  36.         for(int j = 0; j <= n; j++)
  37.             fprintf(out, "%lf ", vec[IND[i]][j]);
  38.         fprintf(out, "\n");
  39.     }
  40.     fprintf(out, "\n");
  41.     fflush(out);
  42. }
  43. */
  44. double getW(int a, int b){
  45.     for(int i = 0; i < OUT_N; i++){
  46.         if(W[a][i].ind == b)
  47.             return W[a][i].data;
  48.     }
  49.     return 0;
  50. }
  51.  
  52. int changeW(int a, int b, double c){
  53.     for(int i = 0; i < OUT_N; i++){
  54.         if(W[a][i].ind == b) {
  55.             W[a][i].data = c;
  56.             return 0;
  57.         }
  58.     }
  59.     return 1;
  60. }
  61.  
  62. void newW(int a, int b, double c){
  63.     for(int i = 0; i < OUT_N; i++)
  64.         if((W[a][i].data == 0) && (W[a][i].ind == 0)){
  65.             W[a][i].data = c;
  66.             W[a][i].ind = (int)b;
  67.             return;
  68.         }
  69. }
  70.  
  71. int main() {
  72.     FILE *in = fopen("input.txt", "r"), *out = fopen("output.txt", "w");
  73.     fscanf(in, "%i %i", &n, &m);
  74.     for(int i = 0; i < m; i++){
  75.         int a, b;
  76.         double w;
  77.         fscanf(in, "%i %i %lf", &a, &b, &w);
  78.         newW(a, b, w);
  79.     }
  80.     for(int i = 0; i < n; i++){
  81.         for(int j =0; j < n; j++){
  82.             if(getW(i, j)){
  83.                 out_v[i]++;
  84.                 in_v[j]++;
  85.             }
  86.         }
  87.     }
  88.     while(!feof(in)){
  89.         int a;
  90.         double d;
  91.         fscanf(in, "%i %lf", &a, &d);
  92.         if(out_v[a] == 0) d *= -1;
  93.         vec[a][n / 2 + 2] = d;
  94.     }
  95.     int vecI = 0;
  96.     for(int i = 0; i < n; ++i){
  97.         if(in_v[i] == 0){
  98.             vec[vecI][vecI] = 1;
  99.             vecIndToW[vecI] = i;
  100.             vecI++;
  101.             continue;
  102.         }
  103.     }
  104.     int in_k = 0, out_k = 0;
  105.     for (int i = 0; i < n; ++i) {
  106.         if(in_v[i] == 0)
  107.             in_k++;
  108.         if(out_v[i] == 0)
  109.             out_k++;
  110.     }
  111.     if(out_k < in_k){
  112.         fprintf(out, "INFINITY!");
  113.         fclose(in);
  114.         fclose(out);
  115.         return 0;
  116.     }
  117.     for (int k = 0; k < n; ++k) {
  118.         for (int i = 0; i < n; i++) {
  119.             if (in_v[i] != 0) continue;
  120.             for (int j = 0; j < n; j++) {
  121.                 double g = getW(i, j);
  122.                 if (g == 0) continue;
  123.                 for(int p = 0; p <= (n / 2) + 2; p++) {
  124.                     vec[j][p] += vec[i][p] * g;
  125.                 }
  126.                 changeW(i, j, 0);
  127.                 --in_v[j];
  128.             }
  129.         }
  130.     }
  131.     int k = 0;
  132.     for (int i = 0; i < n; ++i) {
  133.         if(out_v[i]) continue;
  134.         IND[k++] = i;
  135.     }
  136.     int mk = k;
  137.     for(int i = 0; i < in_k; i++){
  138.         int max = i;
  139.         for(int j = i + 1; j < mk; j++){
  140.             if(fabsf(vec[IND[j]][i]) > fabsf(vec[IND[max]][i]))
  141.                 max = j;
  142.         }
  143.         int t = IND[i];
  144.         IND[i] = IND[max];
  145.         IND[max] = t;
  146.         if(fabs(vec[IND[i]][i] < EPS)){
  147.             fprintf(out, "INFINITY!");
  148.             fclose(in);
  149.             fclose(out);
  150.             return 0;
  151.         }
  152.         for (int j = i + 1; j < mk; ++j) {
  153.             double k = vec[IND[i]][i] / vec[IND[j]][i];
  154.             for(int p = i; p <= n; ++p){
  155.                 vec[IND[j]][p] -= vec[IND[i]][p] / k;
  156.             }
  157.         }
  158.     }
  159.     fprintf(out, "SOLUTION:\n");
  160.     for(int i = mk - 1; i >= 0; i--){ //колво уравнений может быть больше
  161.         if(!vec[IND[i]][i]) continue;
  162.         vec[IND[i]][n / 2 + 2] /= vec[IND[i]][i];
  163.         vec[IND[i]][i] = 1;
  164.         fprintf(out, "%i %0.5f\n", vecIndToW[i], fabsf(vec[IND[i]][n / 2 + 2]));
  165.         for (int j = i - 1; j >= 0 ; --j) {
  166.             vec[IND[j]][n / 2 + 2] -= vec[IND[j]][i] * vec[IND[i]][n / 2 + 2];
  167.         }
  168.     }
  169.     fflush(stdout);
  170.     fclose(in);
  171.     fclose(out);
  172.     return 0;
  173. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement