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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.10.2013, 12:35   #1
Максим 116
Пользователь
 
Регистрация: 06.10.2013
Сообщений: 31
Восклицание Петли в графе

Программа для нахождения кратчайшего цикла в графе.
Поиск цикла обходом графа в ширину.
Проблема с петлями,как сделать "защиту" чтобы нельзя было по ошибке ввести 1 на главной диагонали?

Код:
#include <stdio.h>
#include <conio.h>
#define NMAX 10  /*Max kol-vo vershin*/

/***** Vvod Grafa *****/

void VvodGrafa(int g[NMAX][NMAX], int n)
{
int i,j;// nomer stroki,stolbca
      if(n > 10){
         printf("\nOshibka! Vvedite n <= 10 \n\n");
      }
       printf("Vvedite matricy smeznosti:\n\n");
       printf(" | ");
        for(j=0;j<n;j++)
            printf("%d",j);
            putchar('\n');
            for(i=0;i<2*n+2;i++)
                putchar('-');
                for(i=0;i<n;i++)
                {
                 printf("\n%d| ",i);
                 for(j=0;j<n;j++)
                     scanf("%d",&g[i][j]);}      
}



/*Poisk obhodom v shirinu*/
/*Matrica smegnosti-g,nomera vershin cikla vektor-cmin,dlina cikla-dcmin(3...n)*/
/*0-cikl naiden,1-graf ne imeet ciklov*/


#define NOV -1 /*Vershina novaya,ne vstrechalas*/

int Pminc(int g[NMAX][NMAX], int n, int *dcmin, int cmin[])
{   
    int p[NMAX];      /*Kratchayschie puti k nachalnoy vershine*/
    int q[NMAX];      /*Ochered vershin na posechenie(vektor)*/
    int in,ik;        /*Indexi nachala i konca ocheredi*/
    int i,j;          /*Nomera vershin*/
    int vn,v,vpr;     /*Nomera nachalnyi,tekuchei i prediduchei vershin*/
    int c[NMAX+1];    /*Tekuchui cikl*/
    
    /*Poisk kratchaishego cikla obhodom grafa v shirinu*/
    
    *dcmin=n+1;    /*Dlina min. cikla(3..n)*/
    for(vn=0;vn<n && *dcmin>3;vn++) /*Nachalnaya vershina*/
    {
                  
    /*Obhod v shirinu dereva putei,nachinaushihsya c vn*/
    
       for(i=0;i<n;i++)
       p[i]=NOV;   /*Vse vershini novie*/
       in=0;
       ik=1;       /*Pustaya ochered <==vn*/
       q[0]=vn;   
       do
       {
                  
    /*Vzyat iz ocheredi i posetit vershinu v*/
    
           v=q[in];
           in++;   /*q[0...n-1]*/
           vpr=p[v];
           for(j=0;j<n;j++)
              if(g[v][j]==1 && j!=vpr)
                 if(p[j]==NOV)  /*Vershina j ne posechalas*/
                 {   
                    /*Ochered na posechenie*/
                    q[ik]=j;
                    ik++;          /*q[0...n-1]*/
                    p[j]=v;        /*Predidushaya vershina puti k vn*/
                    }
                    else           /*Cikl iz dvuh putei vn...j*/
                    {
                       /*Sozdat spisok vn->...->v->j*/
                       
                       for(i=v;j!=vn;)
                       {
                          vpr=p[i];
                          p[i]=j;
                          j=i;
                          i=vpr;
                       }
                       
                       /*Zapomnit cikl v->j...->v v vektore c*/
                       
                       c[0]=v;
                       i=v;
                       j=0;
                       do
                       {
                          i=p[i];
                          c[j++]=i;
                       }
                       while(i!=v);
                        if(j<*dcmin)
                        {
                        /*Zapomnit cikl c[0]...c[j]*/
                        *dcmin=j;
                        while(j>=0)
                        cmin[j]=c[j--];
                        }
                        in=ik;
                        break;
                    }
         }
                 while(in!=ik && *dcmin>3); /*Ochered ne pusta*/
                 printf("Kratchaishiy cikl dlinoy");
                 printf(" %d:\n",dcmin);
                 for(j=0;j<n-1;j++)
                 { 
                  printf(" %d ", cmin[j]);
                 }
     }
              return *dcmin>n;
}
                        
#define NMAX 10  /*Max kol-vo vershin*/                        
main()
{
   int n,j;
   int *dcmin;
   int cmin[j];
   int g[NMAX][NMAX];
      printf ("Vvedite kol-vo vershin <= 10 \n n=");
      scanf("%d",&n);
      VvodGrafa(g,n);
      Pminc(g,n,dcmin,cmin);          
      printf("\n\n");
      getch();
}
Максим 116 вне форума Ответить с цитированием
Старый 20.10.2013, 15:25   #2
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Код:
for(j=0;j<n;j++)
                     scanf("%d",&g[i][j]);}
заменить на что-то типа
Код:
for(j=0;j<n;j++) {
  do {
    scanf("%d",&g[i][j]); 
  } while (i == j && g[i][j]);
}
но можно не мучать юзера и автоматически проставить по диагонали нули ))

но я думаю не о вводе петель надо думать, а о том, как исправить алгоритм, который с петлями почему-то не дружит
rrrFer вне форума Ответить с цитированием
Старый 20.10.2013, 16:34   #3
Максим 116
Пользователь
 
Регистрация: 06.10.2013
Сообщений: 31
По умолчанию

Цитата:
но можно не мучать юзера и автоматически проставить по диагонали нули ))
А каким образом это можно в программе изобразить?
Максим 116 вне форума Ответить с цитированием
Старый 20.10.2013, 16:55   #4
Максим 116
Пользователь
 
Регистрация: 06.10.2013
Сообщений: 31
По умолчанию

Код:
for(j=0;j<n;j++)
                 {
                  if(g[i][i]==1)
                  {
                  printf("petli v grafe!");
                  break;
                  }
                  else
                  scanf("%d",&g[i][j]);                    
                 }
После того как вводим 1 на главной диагонали,то вылезает сообщение.Но как остановить ввод?break не спасает.
Максим 116 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Циклы на графе Nicko_mt Помощь студентам 0 27.09.2011 23:51
циклы в графе mira2312 Помощь студентам 1 03.03.2010 18:53
циклы в графе Sasha_91 Общие вопросы C/C++ 1 25.04.2009 12:20
Поиск в графе Selebro Общие вопросы C/C++ 0 14.12.2008 17:06
ШАрик двигается по петли jomix Помощь студентам 3 01.06.2007 12:46