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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.03.2009, 22:16   #1
[MI_nor]
Пользователь
 
Регистрация: 03.11.2008
Сообщений: 94
По умолчанию Рекурсия при построении матрицы достигаемости

Дана матрица смежности некоторого графа из н узлов.
Нужно написать рекурсивную программу построения матрицы достижимостидля этого графа:
Код:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

int matrs[50][50];
int matrd[50][50];

int i,j,k=0,l=0,n;

int add(int matr[50][50])
 {
  int a;
  printf("Vvedite razmernost matrici - ");
  scanf("%d",&n);
  printf("Zapolnit vruchnuiu(1) ili avtomaticheski(2)? - ");
  scanf("%d",&a);
  if (a!=1 && a!=2) {
		     while (a!=1 && a!=2){
					  printf("Incorrect value. Must be 2 or 1\n");
					  scanf("%d",&a);
					 }
		    }
  switch (a)
    {
     case 1:
	    {
	     printf("Vvedite matricy smegnosti - \n");
	     for (i=0;i<n;i++)
	      {
	       for (j=0;j<n;j++)
	       {
		scanf("%d",&matr[i][j]);
		if (matr[i][j]!=0 && matr[i][j]!=1) {
						     printf ("\nIncorrect element [%d,%d](not 0 or 1)\n",i,j);
						     while (matr[i][j]!=0 && matr[i][j]!=1)
						      {scanf(" %d",&matr[i][j]);}
						    }
	       }
	      }
	    }break;
     case 2: {
	      randomize();
	      for (i=0;i<n;i++)
	       {for (j=0;j<n;j++)
		 {
                  if (i==j) matr[i][j]==0; else
		  matr[i][j]=random(2);
		 }
	       }
	     } break;
    }
  return 1;
 }

int rekursiya(int a, int b)
 {
  for(i=a;i<n;i++)
   {
    for (j=b;j<n;j++)
     {
      if (matrs[i][j]==1) {
			   matrd[i][j]=1;
                                     if (matr[i][j]==1 && matr[i][j]==matr[k][l]) matr[k][j]=1;
			   k=i; l=j;
			   rekursiya(j,0);
			  }
     }
   }
 }

void main()
 {
  clrscr();
  add(matrs);
  clrscr();
  printf("Vasha matrica smegnosti - \n");
  for (i=0;i<n;i++)
   {
    for (j=0;j<n;j++)
     {printf("%d ",matrs[i][j]);}
    printf("\n");
   }
  rekursiya(0,0);
  printf("\nVasha matrica dostigaemosti - \n");
  for (i=0;i<n;i++)
   {
    for (j=0;j<n;j++)
     {printf("%d ",matrd[i][j]);}
    printf("\n");
   }

  getch();
 }
Собственно интересен алгоритм рекурсии) я так понимаю если в матр смежности 2 точки соединены напр дугой, то идем от второй дальше по возможным, параллельно ставя 1 в элементах первого, граничящего со 2м , итд...

Элемент матрицы смежности а(и,жи)=1, если существует дуга от вершины и к вершине жи, и
а(и,жи)=0 в противном случае. элемент матрицы достижимости р(и,жи)=1, если из вершины и можно попасть в вершину
жи, двигаясь по стрелкам, и р(и,жи)=0 в противном случае.

Последний раз редактировалось [MI_nor]; 29.03.2009 в 23:52. Причина: Бес попутал
[MI_nor] вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обращение матрицы методом союзной матрицы dofmat Помощь студентам 6 03.10.2011 15:01
Рекурсия. p@ul Помощь студентам 4 30.12.2009 14:46
Вероятностные методы и фракталы в построении графиков Felix Свободное общение 3 28.07.2009 19:08
Рекурсия vitekbest Помощь студентам 1 30.05.2008 22:22
рекурсия Vital_k Паскаль, Turbo Pascal, PascalABC.NET 1 08.02.2008 13:09