Lab 8 backup

                Never    
C
       
//Розробити розклад бронювання місць в готелі, що забезпечив би найбільший прибуток його володарю. Менеджер готелю бронює місця на підставі отриманих замовлень з різними датами приїзду та від'їзду. Кожне бронювання номерів приносить прибуток, який залежить від типу клієнта (студент, службовець, підприємець тощо). Застосувати алгоритм Дейкстри та подати замовлення у вигляді дуги графа, що з'єднує вершини, які відповідають датам приїзду та від'їзду гостей. Вхідні дані та результати розв'язння задачі подати у текстових файлах.

//вписываешь тип посетителя, даты заезда, и создаешь более выгодный путь

#include <stdio.h>
#include <stdbool.h>
//#include<conio.h>

#define infinity 999

int p[31][31];              //graph array
int u = 0 ;
int dist[31];

struct print{
    int arrive;
    int depart;
    int type;
};


void dij(int n,int v,int cost[31][31],int dist[])
{
    int i,count,w,flag[31],min;
    for(i=1;i<=n;i++){
        flag[i]=0;
        dist[i]=cost[v][i];
    }
    count=2;
    while(count<=n)
    {
        min=99;
        for(w=1;w<=n;w++)
            if(dist[w]<min && !flag[w]){
                min=dist[w];
                u=w;
            }
        flag[u]=1;
        count++;
        for(w=1;w<=n;w++)
            if((dist[u]+cost[u][w]<dist[w]) && !flag[w])
                dist[w]=dist[u]+cost[u][w];
    }
}

int main() {
    
    int ammount_v = 0;
    printf("Input ammount of visitors:");
    scanf("%d", &ammount_v);
    
    int edges = ammount_v;
    
    printf("\nGraph:\n");
    
    for (int i=1;i<=31;i++) {
        for (int j=1;j<=31;j++){
            p[i][j]=999;
            printf("%d ", p[i][j]);
        }
        printf("\n");
    }
    
    
    printf("\nAmmount of edges: %d\n", edges);
    
    printf("Type of visitors:\n1.Student - 100 uan/night\n2.Worker - 200 uan/night\n3.Businessman - 400 uan/nigt\nDates of next visitor should be out of range pervious(only same arrive date)\n");
    
    int type = 0;
    int arrival = 0;
    int departure = 0;
    
    int arrivals[100];
    int departures[100];
    int c = 0;
    
    for(int i=0; i<edges; i++){
        printf("\nInput type of visitor(1 - student; 2 - worker; 3 - businessman): ");
        scanf("%d", &type);
        if(type == 3){
            type = 4;
        }
        printf("Input arrival date(from 1 to 30, != departure date of previous visitors):");
        scanf("%d", &arrival);
        printf("Input departure date(from 2 to 31, != arrival date):");
        scanf("%d", &departure);
        p[arrival][departure] = type;
        arrivals[c] = arrival;
        departures[c] = departure;
        c++;
    }
    
    printf("\nEdited graph:\n");
    
    for (int i=1;i<=31;i++) {
        for (int j=1;j<=31;j++){
            printf("%d ", p[i][j]);
        }
        printf("\n");
    }
    
    int n = 31;
    int z = 0;
    int number = 0;
    int step = 1;
    
    
    FILE *file;
    file = fopen("/Users/andrew/Desktop/Прога/Lab 8 Kovaluk/Lab 8 Kovaluk/lab8.txt","w");
    
    
    for(int i=0; i<ammount_v; i++){
        if(arrivals[i]!=arrivals[i-1]){
            
            printf("\n\nStep %d", step);
            step++;
            
            printf("\nDestination from date %d:",arrivals[i]);
            number = arrivals[i];
            dij(n,arrivals[i],p,dist);
            
            int counter = 0;
            
            struct print print_arr[31];
            struct print *p = print_arr;            //указатель на массив структур
            
            float kostyl[93];             //сохраняет цену поездки каждого клиента с одного числа
            int j = 0;
            printf("\nShortest path:\n");
            for(int i=1;i<=31;i++){
                if(i!=arrivals[i]){
                    if(dist[i]!=999){
                        printf("%d->%d,type=%d\n",number,i,dist[i]);
                        print_arr[j].arrive = number;
                        print_arr[j].depart = i;
                        print_arr[j].type = dist[i];
                        counter++;
                        kostyl[j] = (i-number)*dist[i];
                        j++;
                        z = z+3;
                    }
                }
            }
            
            
            float max = kostyl[0];
            int best = 0;
            char equal[] = "Variants are equal\n";
            for(int i = 0; i < counter; i++)
            {
                if(kostyl[i] > max)
                {
                    max = kostyl[i];
                    best = i;
                }
                else if(kostyl[counter-1] == max){
                    printf("Variants are equal  or there is the only one(amount of money will be the same)\n");
                    max = infinity;
                }
            }
            char text[] = "Best choice will give: ";
            char uan[] = "uan";
            char n[] = "\n";
            
            if(max!=infinity){
                printf("\nBest choice will give: %f uan\n", max*100);
            
                fwrite (&text, 24, 1, file);            //printing into the text file
                fprintf(file,"%f", max*100);
                fwrite (&uan, 3, 1, file);
                fwrite (&n,2, 1, file);
                fwrite (&n,2, 1, file);
            
                printf("Choice is: %d -> %d,uan/night = %d00\n", print_arr[best].arrive, print_arr[best].depart, print_arr[best].type);
                char next[] = " -> ";
                char cost[] = " cost = ";
            
            
                fprintf(file,"%d", print_arr[best].arrive);
                fwrite (&next, 3, 1, file);
                fprintf(file,"%d",print_arr[best].depart);
                fwrite (&cost, 7, 1, file);
                fprintf(file,"%d",print_arr[best].type);
                fwrite (&n, 2, 1, file);
            }
            
            else if(max == infinity){
                fwrite (&equal, 20, 1, file);
                printf("Choice is: %d -> %d,uan/night = %d00\n", print_arr[best].arrive, print_arr[best].depart, print_arr[best].type);
                char next[] = " -> ";
                char cost[] = " cost = ";
                
                
                fprintf(file,"%d", print_arr[best].arrive);
                fwrite (&next, 3, 1, file);
                fprintf(file,"%d",print_arr[best].depart);
                fwrite (&cost, 7, 1, file);
                fprintf(file,"%d",print_arr[best].type);
                fwrite (&n, 2, 1, file);
                
            }
        }
        
    }

    
    
     fclose(file);
    

    return 0;
}