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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.06.2009, 00:35   #1
Garf2009
Новичок
Джуниор
 
Регистрация: 10.06.2009
Сообщений: 1
Сообщение Алгоритм Уоршилла

Всем привет. Уже несколько дней мучаюсь, не могу понять алгоритм Уоршелла, пробовал по шагам на бумажке сделать, никак не доходит, слишком сложно для меня понимание. Вообще, я вот пробовал сделать задачу на графы, найти компоненты связности с помощью этого алгоритма. Помоему программа работает, но преподаватель сказал, что не правильно, даже незнаю, что делать. Вот код:
Задача:

Мостом графа назовем такое ребро, удаление которого увеличивает число компонент связности графа. Найти все мосты заданного графа.


Исходный текст программы:



Код:
#include <stdio.h>
#include <conio.h>
#define NMAX 20 /*Максимальное количество вершин*/

int prov[NMAX][NMAX], c[NMAX][NMAX], kol=0;

 /*Глобальные переменные, массивы изначально инициализируется нулями,
 в переменная kol  будет находится значение, определяющая количество мостов*/


/*В функции vvod, вводятся ребра и формируется матрица смежности*/

void vvod (int k, int ms[NMAX][NMAX])
{
 int i, j;

 for (i=0; i<k; i++)
    for (j=0; j<k; j++)
       ms[i][j]=0;
 puts ("\nВведите ребра:");
 while (scanf("%d %d", &i, &j)==2)
    {
     ms[i][j]=1; ms[j][i]=1;
    }

}



/*Данная функция  не обязательна, но я включил её для того, чтоб напечатать матрицу смежности*/

void vivodmatsm (int k, int ms[NMAX][NMAX])
{
 int i, j;

 printf("\nМатрица смежности:\n");
 for (i=0; i<k; i++)
    {
     putchar ('\n');
     for (j=0; j<k; j++)
	printf("%d", ms[i][j]);
    }
}

/*Эта функция копирует матрицу достижимости в массив prov[i][j]*/

int kopmatdos(int n, int ms[NMAX][NMAX])
{
 int i, j, k;

 for (i=0; i<n; i++)
    for(j=0; j<n; j++)
       c[i][j]=ms[i][j];
 for (i=0; i<n; i++)
    c[i][i]=1;
 //Yorshall
 for(k=0; k<n; k++)
    for(i=0; i<n; i++)
       if (c[i][k])
	  for(j=0; j<n; j++)
	     {
	      c[i][j]=c[i][j] || c[k][j];
	     }
  //Копирование матриц
  for (i=0; i<n; i++)
    for(j=0; j<n; j++)
       prov[i][j]=c[i][j];
 return 0;
}


/*Функция строит матрицу достижимости*/

int poisk(int n, int ms[NMAX][NMAX])
{
 int i, j, k;

 for (i=0; i<n; i++)
    for(j=0; j<n; j++)
       c[i][j]=ms[i][j];
 for (i=0; i<n; i++)
    c[i][i]=1;
 //Yorshall
 for(k=0; k<n; k++)
    for(i=0; i<n; i++)
       if (c[i][k])
	  for(j=0; j<n; j++)
	     {
	      c[i][j]=c[i][j] || c[k][j];
	     }
 return 0;
}

/*Функция proverka, проверяет, есть ли изменение очередной матрицы достижимости с первой*/

proverka(int n)
{
 int i, j;

 for(i=0; i<n; i++)
    for(j=0; j<n; j++)
       if(c[i][j]!=prov[i][j])
	  {
	   return 1;
	  }
 return 0;
}






/*Главная функция*/
main()
{
 int g[NMAX][NMAX];
 int i, j;
 int n, a[NMAX],b[NMAX], p=0;

 puts ("\nВведите количество вершин:");
 scanf ("%d", &n);
 vvod (n, g);
 vivodmatsm (n, g);
 kopmatdos(n, g);
 for (i=0; i<n; i++)
    for(j=0; j<n; j++)
       if(g[i][j]==1)
	   {
	    g[i][j]=g[j][i]=0;
	    poisk(n, g);
	    if (proverka(n)==1)
	       {
		kol++;
		a[p]=i;
		b[p]=j;
		p++;
	       }
	    g[i][j]=g[j][i]=1;
       }
 printf("\nКоличество найденных мостов графа:%d\n", kol/2);
 p=0;
printf("\nНомера вершин мостов графа\n");
/*Вывод на печать номера вершин мостов*/
 while (p!=kol)
    {
     printf("%d %d|", a[p], b[p]);
     p++;
    }
 getch();
 return 0;
}

Последний раз редактировалось Sazary; 10.06.2009 в 00:48.
Garf2009 вне форума Ответить с цитированием
Старый 10.06.2009, 11:58   #2
Kriks
Новичок
Джуниор
 
Регистрация: 10.06.2009
Сообщений: 14
По умолчанию

Я бы вам советовал обрабатывать getch() след образом:

Код:
#ifdef _DEBUG
getch();
#endif
А то в релизованном приложении гетч будет обязывать нажимать еше раз ENTER.

Но не подумайте что это решение проблемы

Последний раз редактировалось Kriks; 10.06.2009 в 12:03.
Kriks вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Алгоритм А* Claster Помощь студентам 1 24.05.2011 18:45
Алгоритм G@sh!sh Общие вопросы по Java, Java SE, Kotlin 4 21.06.2009 16:17
алгоритм lucky Паскаль, Turbo Pascal, PascalABC.NET 4 07.05.2009 12:56
Алгоритм Artruman Общие вопросы Delphi 4 09.04.2009 00:59
Алгоритм Rifler Паскаль, Turbo Pascal, PascalABC.NET 3 30.03.2008 01:33