printf("Vniz\n\r");
break;
case 3:
fprintf(fil,"Vlevo\n");
printf("Vlevo\n\r");
break;
case 4:
fprintf(fil,"Vverh\n");
printf("Vverh\n\r");
break;
default:
fprintf(fil,"Start\n");
printf("Start\n\r");
break;
}
fprintf(fil,"WORK MATRIX\n");
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
fprintf(fil,"%5d",*(matr2+i*n+j));
}
fprintf(fil,"\n");
}
fprintf(fil,"************************************\n");
return;
}
// **************** UPGRADE PLAN *********************************//
void plmi(void)
{
int i,j,k,min,i1,j1,flagok;
ch = ch2;
flagok = 0;
i1=*zi;
j1 = *zj;
for(k=1;k<ch;k+=2){
i=*(zi+k);
j = *(zj+k);
if(*(matr+i*n+j) == -2){
*(matr+i1*n+j1) = *(matr+i*n+j);
*(matr+i*n+j) = 0;
flagok = 1;
break;
}
} // for
if(!flagok){
for(k=2;k<ch;k+=2){
i = *(zi+k);
j = *(zj+k);
if(*(matr+i*n+j) == -2)
*(matr+i*n+j) = 0;
} // for
i = *(zi+1);
j = *(zj+1);
min = *(matr+i*n+j);
for(k=3;k<ch;k+=2){
i=*(zi+k);
j=*(zj+k);
if(*(matr+i*n+j)<min)
min = *(matr+i*n+j);
}
if(min == -2) min = 0;
for(k=0;k<ch;k+=2){
i = *(zi+k);
j = *(zj+k);
*(matr+i*n+j) += min;
}
for(k=1;k<ch;k+=2){
i=*(zi+k);
j=*(zj+k);
*(matr+i*n+j)-=min;
}
} //if
// ***************** PROVERKA **************************//
printf("PROVERKA\n");
for(i=0;i<m;i++){
for(j=0;j<n;j++){
printf("%5d",*(matr+i*n+j));
}
printf("\n");
}
free(matr2);free(zi);free(zj);free(pu);free(pv);
return;
}
void Bas(void)
{
int i,j;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
if(*(matr+i*n+j)!=0) basper++;
}
}
return;
}
void sohran(void)
{
// Sravnenie
int i,j,k;
for(k=0;k<ch;k++)
{
i=zi[k];
j=zj[k];
if((*(matr+i*n+j) == 0) && (basper < m+n-1))
{
*(matr+i*n+j) = -2;
basper++;
}//if
}
return;
}
// ************ SOZDANIE OPORNOGO PLANA **************************
// ************ METODOM SEVERNO-ZAPADNOGO YGLA *******************
void opplan1(void)
{
int i,j, ch1 = n-1;
//**************** Viydelenie pamyty *************************
if((matr=(int*)calloc(m*n,sizeof(int))) == NULL) abort();
for(i=0;i<m;i++)
{
for(j=ch1;j>=0;j--)
{
if(*(po+i)<*(pn+j))
{
*(matr+i*n+j)=*(po+i);
*(pn+j)-=*(po+i);
*(po+i)=0;
break;
}
*(matr+i*n+j)=*(pn+j);
*(po+i)-=*(pn+j);
*(pn+j)=0;
ch1--;
}
}
//*************** Proverka *************************
printf("Proverka\n");
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
printf("%5d",*(matr+i*n+j));
}
printf("\n");
}
fprintf(fil,"matrix\n");
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
fprintf(fil,"%5d",*(matr+i*n+j));
}
fprintf(fil,"\n");
}
fprintf(fil,"*****************\n");
return;
}//******** opplan1
//************** SOZDANIE OPORNOGO PLANA ********************
//*************** METHOD NORD-WEST YGOL *********************
void opplan2(void)
{
int i,j,k_i,k_j=0, min = 32767, *kontr,fl;
if((matr=(int*)calloc(m*n,sizeof(int))) == NULL) abort();
if((kontr=(int*)calloc(m*n,sizeof(int))) == NULL) abort();
for(i=0;i<m;i++){
for(j=0;j<n;j++){
*(kontr+i*n+j) = 0;
}
}
for(i=0;i<m;i++){
fl = 0;
while(!fl){
for(j=0;j<n;j++){
if(*(st+i*n+j)<min){
if(*(kontr+i*n+j) == 0) {
min = *(st+i*n+j);
k_i = i; k_j = j;
}
}
}
*(kontr+k_i*n+k_j) = 1;
if(*(po+k_i)<*(pn+k_j)) {
min = 32767;
*(matr+k_i*n+k_j)=*(po+k_i);
*(pn+k_j)=*(po+k_i);
*(po+k_i)=0;
break;
}
else {
*(matr+k_i*n+k_j)=*(pn+k_j);
*(po+k_i)-=*(pn+k_j);
*(pn+k_j)=0;
min = 32767;
if(*(po+k_i) == 0) fl = 1;
}
}
}
printf("Proverka\n"); // proverka
for(i=0;i<m;i++){
for(j=0;j<n;j++){
printf("%5d",*(matr+i*n+j));
}
printf("\n");
}
fprintf(fil," matr\n");
for(i=0;i<m;i++){
for(j=0;j<n;j++){
fprintf(fil,"%5d",*(matr+i*n+j));
}
fprintf(fil,"\n");
}
fprintf(fil,"*********************************\n");
return;
}// opplan2
void main()
{
int i,j,met;
int flagok;
fil = fopen("otchet.txt","w");
clrscr();
gotoxy(1,3);
printf("WARNING USERS ---->\n\n\n");
printf("Решение закрытой трансп.задачи\n\n");
printf("Базисные переменные,равные нулю, помечаются -2;\n");
printf("Графоклетка, относительно которой строится цепь\n");
printf("помечается -1\n");
gotoxy(1,22);
printf("press anykey to contunio...\n");
getch();
clrscr();
data();
printf("press anykey to contunio...\n");
getch();
clrscr();
gotoxy(1,3);
printf("\n YOU selest method building first plan:\n");
printf("1-method NORD-WEST ygol\n");
printf("2-method NORD-EST ygol\n");
printf("3-method minimum element to string\n");
scanf("%d",&met);
gotoxy(1,22);
printf("press anykey, to contunie...\n");
getch();
//void opplan(void);
//void opplan1(void);
//void opplan2(void);
clrscr();
switch(met)
{
case 1: opplan();
break;
case 2: opplan1();
break;
case 3: opplan2();
break;
default: printf("неверно выбран МЕТОД\n"); exit(-1);
}
basper = 0;
Bas();
flagok = 0;
if(basper<m+n-1)
{
//Если в первоначальном плане количество базисных
//переменных, отличных от нуля, меньше, чем M+N-1
while(!flagok)
{
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
if(*(matr+i*n+j)==0)
{
*(matr+i*n+j) = -2;
flagok = 1;
basper++;
break;
} //if
}
if(flagok) break;
}
if(basper<m+n-1) flagok = 0;
}//while
}//if
for(;;)
{
fprintf(fil,"*********** Начало ДОЛБАНУТОЙ Итерации**********\n");
basper = 0;
Bas();
//void sohran(void);
if(iter>0)
{
//Количество базисных ненулевых переменных <m+n-1
if(basper <m+n-1) sohran();
}
kost(); //****** Вывод общей стоимости******
potenzial(); //*******Подсчет потенциалов********
ch2 = 0;
z = optim();
if(!z) break;
plmi();
iter++;
fprintf(fil,"%d ШАГ ДОСТАВШЕЙ ДО СЪЕХАВШЕЙ КРЫШИ ИТЕРАЦИИ",iter);
}
//************* ПРОВЕРКА************
printf("\n\nOPTIMAL PLAN :\n");
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
printf("%5d",*(matr+i*n+j));
}
printf("\n");
}
fprintf(fil,"optimal PLAN :\n");
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
fprintf(fil,"%5d",*(matr+i*n+j));
}
fprintf(fil,"\n");
}
kost(); //************ВЫВОД общей стоимости***********
fclose(fil);
clrscr();
printf("Отчет о проделанной работе ПРОГРАММЫ в файле otchet.txt");
getch();
return;
} // main