Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.04.2012, 19:51   #1
dangerous108
Новичок
Джуниор
 
Регистрация: 30.03.2012
Сообщений: 1
По умолчанию транспортная задача

Здравствуйте! Ребят, помогите найти и исправить ошибку.
Есть код на с, одну задачу он решает правильно, а другую нет...
45 15 22 20
25 9 5 3 10
55 6 3 8 2
22 3 8 4 7


PHP код:
//====================================================================
   
void pereraspred(int *proc,int *pd,int *ka,int *kb,int *pz,int *pl)
      {
int ini=6,inj=6;
       
hu:
       
int *z,*l,max,min,kold;
       
int x=6,y=6,fun1=0,ax=6,bx=6;
       
int i,j,t,k,f,q,w;       //--Динамическое распределение памяти
       
ka=(int*)malloc(3*sizeof(int));
       
kb=(int*)malloc(4*sizeof(int));
       
z=(int*)malloc(6*sizeof(int));
       
l=(int*)malloc(12*sizeof(int));
       for(
i=0;i<3;i++)
    for(
j=0;j<4;j++)
     *(
pl+j+4*i)=0;
       for(
i=0;i<3;i++)
    for(
j=0;j<4;j++)
     if(*(
pd+j+4*i)!=0)*(pl+j+4*i)=1;
       for(
i=0;i<3;i++)
     *(
ka+i)=99;
       for(
j=0;j<4;j++)
     *(
kb+j)=99;
       *(
kb+0)=0;
       
kold=0;
       
max=*(proc+0+4*0);

//--Проверка на вырожденность
       
for(i=0;i<3;i++)  //Кол.строк + кол.столбцов-1=кол.заполн.клеток
    
for(j=0;j<4;j++)
      if(
max<*(proc+j+4*i)) max=*(proc+j+4*i);
       
min=max;
       for(
i=0;i<3;i++)
    for(
j=0;j<4;j++)
      if(*(
pd+j+4*i)!=0)kold++;
       if(
kold<6){ for(i=0;i<3;i++)
           for(
j=0;j<4;j++)
            {if((
i==ini) && (j==inj))continue;
             else if((
min>*(proc+j+4*i)) && *(pd+j+4*i)==0){min=*(proc+j+4*i);
                                 
x=i;
                                 
y=j;}}
               *(
pl+y+4*x)=3;
               
ini=6;
               
inj=6;
               }
//--Нахождение потенциалов
       
while(1)
       {
t=0;
    for(
j=0;j<4;j++)
      {for(
i=0;i<3;i++)
        if(*(
pd+j+4*i)!=0||*(pl+j+4*i)==3)
           if(*(
kb+j)!=99)*(ka+i)=*(proc+j+4*i)-*(kb+j);
           else if(*(
ka+i)!=99)*(kb+j)=*(proc+j+4*i)-*(ka+i);
            else 
t++;
        else continue;
       }
    if(
t==0) break;
       }
//--Вывод матрицы Сij с потенциалами
    
printf("\nМатрица времени работ(C)");
    
printf("\n");
    for(
i=0;i<4;i++)
      if(
i!=3){for(j=0;j<5;j++)
           if(
j!=4)printf(" %d ",*(proc+j+4*i));
           else 
printf("│ %d",*(ka+i));
           
printf("\n");
          }
      else {
printf("────────────┘");
        
printf("\n");
        for(
j=0;j<4;j++)
           
printf(" %d ",*(kb+j));
        }
    
printf("\n");

//--Нахождение дельт
    
max=0;
    
q=0;
    for(
i=0;i<3;i++)
     for(
j=0;j<4;j++)
       {if(*(
pd+j+4*i)!=0||*(pl+j+4*i)==3)continue;
         else {*(
pz+q)=*(ka+i)+*(kb+j)-*(proc+j+4*i);
           if(
max<*(pz+q)){max=*(pz+q);
                   
k=i//Дельта=Сумма потенциалов-Cij
                   
f=j;}
            
q++;}
              }
      *(
pl+f+4*k)=5;
    for(
i=0;i<3;i++)
    for(
j=0;j<4;j++)
     
fun1+=*(proc+j+4*i)**(pd+j+4*i);

    
printf("\nМатрица распределения времени(D)\n");
   for(
i=0;i<3;i++)
   {for(
j=0;j<4;j++)
    
printf(" %d ",*(pd+j+4*i));
    
printf("\n");
    }
    
getch();

//--Ответ на печать
 
if(max<=0){printf("\t\t\tМинимальная сумма затрат времени на \n\t\t\tобслуживание участков работ равна %d",fun1);
    return;}
  else
    { 
w=k;
      while(
1)
       {
    
met:i=w;
    for(
j=0;j<4;j++)
     if(*(
pl+j+4*i)==|| *(pl+j+4*i)==|| *(pl+j+4*i)==7)continue;
      else
       {
        *(
pl+j+4*i)=2;
        
ax=i;bx=j;
        for(
i=0;i<3;i++)
         if(
i==ax)continue;
          else{ if(*(
pl+j+4*i)==5){t=0;
        for(
i=0;i<3;i++)
        for(
j=0;j<4;j++)
          {if(*(
pl+j+4*i)==2)
          if(
t==0){min=*(pd+j+4*i);
            
t++;
            if(
min==0)
             {
ini=i;
              
inj=j;
              goto 
hu;}
            }
             else if(
min>=*(pd+j+4*i))
                { 
min=*(pd+j+4*i);
                  if(
min==0)
                  {
ini=i;
                   
inj=j;
                   goto 
hu;}
                 }
              }
            for(
i=0;i<3;i++)
            for(
j=0;j<4;j++)
             if((*(
pl+j+4*i)==5) || (*(pl+j+4*i)==7))
            *(
pd+j+4*i)+=min;
             else if(*(
pl+j+4*i)==2)
             *(
pd+j+4*i)-=min;
             
free(l); //--Освобождение памяти
             
free(z);
             
free(ka);
             
free(kb);
             goto 
hu;
         }
           else if((*(
pd+j+4*i)!=|| *(pl+j+4*i)==3))
          {
           *(
pl+j+4*i)=7;
           
w=i;
           goto 
met;}
           else *(
pl+j+4*i)=0;}
           *(
pl+bx+4*ax)=0;
           
i=w;
           }
          }
      } 
dangerous108 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Транспортная задача RocBoy-D Помощь студентам 0 11.03.2012 13:00
Транспортная задача adidas_pro Помощь студентам 2 06.06.2011 01:56
Транспортная задача nadia.mot Microsoft Office Excel 2 18.10.2010 00:36
Транспортная задача nadia.mot Помощь студентам 0 17.10.2010 19:09