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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.04.2014, 18:58   #1
East Undia Trading
Форумчанин
 
Регистрация: 02.10.2013
Сообщений: 231
По умолчанию Поиск вершин в графе.Язык С/С++

Мне необходимо найти вершины из которых дуги только выходят, но не понимаю какому признаку должно удовлетворять данное условие.И еще вопрос, какой алгоритм поиска лучше использовать?
Полный текст задания:
Цитата:
Во взвешенном орграфе найти все стоки, то есть вершины, в которые только входят дуги, и истоки, т. е. вершины, из которых дуги только выходят, а также кратчайший путь, связывающий две заданные вершины. Списки смежности орграфа и номера вершин для поиска вводятся с клавиатуры.
East Undia Trading вне форума Ответить с цитированием
Старый 19.04.2014, 20:54   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,342
По умолчанию

Имеем список смежности:
Xi -> Yi, что обозначает путь из Xi в Yi
Получаем два множества X и Y. Множество X-Y - истоки. Множество Y-X - стоки.

Еще один способ - построить матрицу смежности. Номер строки - номер вершины-выхода, номер столбца - номер вершины-входа. Столбец, заполненный нулями, соответствует вершине-истоку. Строка, заполненная нулями, соответствует вершине-стоку.

Список алгоритмов поиска пути
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 25.04.2014, 23:09   #3
East Undia Trading
Форумчанин
 
Регистрация: 02.10.2013
Сообщений: 231
По умолчанию

Код:
#include <stdio.h>
#include <stdlib.h>

void FindWay( Graph&, int, int ); //тут ругается
 
void ForStep( Graph& g, int ixArc )  //тут ругается
{ 
     int transit = g.arcs[ ixArc ].from; 
     int step    = g.arcs[ ixArc ].to; 
 
     double newSumWeight = g.pMinWay[ transit ].sumWeight + g.arcs[ ixArc ].weight; 
 
     if( !g.pMinWay[ step ].exist ) 
     { 
     g.pMinWay[ step ].exist = true; 
  
     g.pMinWay[ step ].sumWeight = newSumWeight; 
  
     g.pMinWay[ step ].refPrev = transit; 
      FindWay( g, step, finish ); 
     } 
     else 
     { 
         if( g.pMinWay[ step ].sumWeight > newSumWeight ) 
         { 
         g.pMinWay[ step ].sumWeight = newSumWeight; 
         g.pMinWay[ step].refPrev = transit; 
         FindWay( g, step, finish ); 
         } 
     } 
} 
  
void FindWay( Graph& g, int transit, int finish )  //тут ругается
{ 
   if( transit == finish ) return; 
 
   for( int ixArc=0; ixArc < g.numArcs; ixArc++ ) 
   { 
   if( g.arcs[ ixArc ].from == transit ) 
   ForStep( g, ixArc ); 
  } 
  return; 
}
Разобрался

Последний раз редактировалось Stilet; 26.04.2014 в 09:53.
East Undia Trading вне форума Ответить с цитированием
Старый 27.04.2014, 01:04   #4
East Undia Trading
Форумчанин
 
Регистрация: 02.10.2013
Сообщений: 231
По умолчанию

Разобрался

Последний раз редактировалось East Undia Trading; 27.04.2014 в 01:41.
East Undia Trading вне форума Ответить с цитированием
Старый 29.04.2014, 00:29   #5
East Undia Trading
Форумчанин
 
Регистрация: 02.10.2013
Сообщений: 231
По умолчанию

Все равно ничего не понял.Я нашел это решение в интернете, но сам понять что там происходит не могу.Что должно передаваться в FindWay?Что за тип такой Graph& ?То что у меня получилось ниже, как и текст задания, ниже.
Цитата:
Во взвешенном орграфе найти все стоки, то есть вершины, в которые только входят дуги, и истоки, т. е. вершины, из которых дуги только выходят, а также кратчайший путь, связывающий две заданные вершины. Списки смежности орграфа и номера вершин для поиска вводятся с клавиатуры.
PHP код:
struct edge_struct
{
    
int node;     //номер узла
    
int in[80];   //номера входящих ребер
    
int out[80];  //номера исходящих ребер 
};
struct edge_item
{
    
int id;
    
int inedge;
    
int outedge;
    
int weight;

};

int main(){
    
FILE *edge,*node;
    
int n,i,node_number,edge_number;
    
struct edge_struct edge_item[n];
    if(!
edge=fopen("edge.txt","r"))
    {    
       
fread(&n,sizeof(int),1,edge);
       
struct edge_struct edge_item[n];
         
edge_number;
       
i=0;
       while(!
eof(edge))
       {
       
fread(&n,sizeof(int),edge);
       
edge_item[i].id=n;
       
fread(&n,sizeof(int),edge);
       
edge_item[i].out=n;
       
fread(&n,sizeof(int),edge);
       
edge_item[i].in=n;
       
fread(&n,sizeof(int),edge);
       
edge_item[i].weight=n;            
       }   
    }
if(!
node=fopen("node.txt","r")){
fread(&n,sizeof(int),1,node);
struct node_struct node_item[n];
node_number=n;
}
close(edge);
close(node);
for(
i=0;i<n;i++)
{
    
scanf("%d"edge_struct.in);
    
scanf("d"edge_struct.out);
}
    


PHP код:
#include <stdio.h>
#include <stdlib.h>

void FindWayGraph&, intint );
 
void ForStepGraphgint ixArc )

     
int transit g.arcsixArc ].from
     
int step    g.arcsixArc ].to
 
     
double newSumWeight g.pMinWaytransit ].sumWeight g.arcsixArc ].weight
 
     if( !
g.pMinWaystep ].exist 
     { 
     
g.pMinWaystep ].exist true
  
     
g.pMinWaystep ].sumWeight newSumWeight
  
     
g.pMinWaystep ].refPrev transit
      
FindWaygstepfinish ); 
     } 
     else 
     { 
         if( 
g.pMinWaystep ].sumWeight newSumWeight 
         { 
         
g.pMinWaystep ].sumWeight newSumWeight
         
g.pMinWaystep].refPrev transit
         
FindWaygstepfinish ); 
         } 
     } 

  
void FindWayGraphgint transitint finish )  //тут ругается

   if( 
transit == finish ) return; 
 
   for( 
int ixArc=0ixArc g.numArcsixArc++ ) 
   { 
   if( 
g.arcsixArc ].from == transit 
   
ForStepgixArc ); 
  } 
  return; 

East Undia Trading вне форума Ответить с цитированием
Старый 29.04.2014, 00:39   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,342
По умолчанию

По поводу Вашего кода - есть ошибки. Смысла тоже не уловил. Зачем 2 структуры? Что за 2 файла? Как задумывалась работа?
По поводу второго кода - судя по всему, этот код на C++. Graph, скорее всего, самописный тип. А Grapsh& - это аргумент-ссылка.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 29.04.2014, 00:51   #7
East Undia Trading
Форумчанин
 
Регистрация: 02.10.2013
Сообщений: 231
По умолчанию

BDA, работа задумывалась как заполнение структуры графа значениями->резервирование памяти для массивов arcs и PMinway.Получилось то, что получилось
Код:
поле номер 1 номер узла
поле 2 массив  номеров входящих ребер
поле 3 массив номеров исходящих ребер
и структура ребер
номер ребра
исходящий узел
узел вхождения
вес ребра
East Undia Trading вне форума Ответить с цитированием
Старый 29.04.2014, 18:03   #8
East Undia Trading
Форумчанин
 
Регистрация: 02.10.2013
Сообщений: 231
По умолчанию

Для начала я не могу правильно загрузить граф из файла , можете подсказать в чем проблема?
Код:
if(!edge=fopen("edge.txt","r"))
Здесь пишет [Error] lvalue required as left operand of assignment
Код:
struct edge_struct
{
    int node;     //номер узла
    int in[80];   //номера входящих ребер
    int out[80];  //номера исходящих ребер 
};
struct edge_item
{
    int id;
    int inedge;
    int outedge;
    int weight;

};

int main(){
    FILE *edge,*node;
    int n,i,node_number,edge_number;
    struct edge_struct edge_item[n];
    if(!edge=fopen("edge.txt","r"))
    {    
       fread(&n,sizeof(int),1,edge);
       struct edge_struct edge_item[n];
         edge_number;
       i=0;
       while(!eof(edge))
       {
       fread(&n,sizeof(int),edge);
       edge_item[i].id=n;
       fread(&n,sizeof(int),edge);
       edge_item[i].out=n;
       fread(&n,sizeof(int),edge);
       edge_item[i].in=n;
       fread(&n,sizeof(int),edge);
       edge_item[i].weight=n;            
       }   
    }
if(!node=fopen("node.txt","r")){
fread(&n,sizeof(int),1,node);
struct node_struct node_item[n];
node_number=n;
}
close(edge);
close(node);
for(i=0;i<n;i++)
{
    scanf("%d", edge_struct.in);
    scanf("d", edge_struct.out);
}
    
}

Последний раз редактировалось East Undia Trading; 29.04.2014 в 18:21.
East Undia Trading вне форума Ответить с цитированием
Старый 29.04.2014, 18:50   #9
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,342
По умолчанию

Код:
if (edge = fopen("edge.txt", "r"))
Восклицательный знак не нужен.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 29.04.2014, 21:46   #10
East Undia Trading
Форумчанин
 
Регистрация: 02.10.2013
Сообщений: 231
По умолчанию

BDA, я исправил main и вот что получилось.
Код:
#include <stdio.h>
#include <stdlib.h>
const n;
void FindWay(edge_struct, int, int ); // Предварительное объявление 
struct edge_struct
{
	int id;     //номер узла
	int in;   //номера входящих ребер
    int out;  //номера исходящих ребер 
    int weight;
};
int main(){
    FILE *edge,*node;
    int n,i,node_number,edge_number;
    struct edge_struct *newList;
    newList = (struct edge_struct *) malloc(sizeof(struct edge_struct));
    struct edge_struct edge_item[n];
    if(edge=fopen("edge.txt","r"))
	{	
       fread(&n,sizeof(int),1,edge);
       struct edge_struct edge_item[n];
         edge_number;
       i=0;
       while(!eof(edge))
	   {
       fread(&n,sizeof(int), 1,edge);
       edge_item[i].id=n;
       fread(&n,sizeof(int),1 ,edge);
       edge_item[i].out=n;
       fread(&n,sizeof(int),1 ,edge);
       edge_item[i].in=n;
       fread(&n,sizeof(int),1 ,edge);
       edge_item[i].weight=n;            
	   }   
	}
if(node=fopen("node.txt","r")){
fread(&n,sizeof(int),1,node);
struct edge_struct edge_item[n];
node_number=n;
}
close(edge);
close(node);
for(i=0;i<n;i++)
{
	scanf("d", newList->in);
	scanf("d", newList->out);
}
}



 
// Шаг по дуге ixArc к вершине, смежной с вершиной transit 
void ForStep( struct node_struct, int ixArc ) 
{ 
     int transit = g.arcs[ ixArc ].from; // Транзитная вершина 
     int step    = g.arcs[ ixArc ].to; // Смежная вершина 
 
     // Вычисляем новый суммарный вес пути через transit до step 
     double newSumWeight = g.pMinWay[ transit ].sumWeight + g.arcs[ ixArc ].weight; 
 
     if( !g.pMinWay[ step ].exist ) 
     { 
     // Эта вершина раскрыта впервые 
     g.pMinWay[ step ].exist = true; 
  
     g.pMinWay[ step ].sumWeight = newSumWeight; 
  
     g.pMinWay[ step ].refPrev = transit; 
      FindWay( g, step, finish ); 
     } 
     else 
     { 
         // Эта вершина раньше встречалась 
         if( g.pMinWay[ step ].sumWeight > newSumWeight ) 
         { 
          // Новый путь короче 
         g.pMinWay[ step ].sumWeight = newSumWeight; 
         g.pMinWay[ step].refPrev = transit; 
         FindWay( g, step, finish ); 
         } 
         // Здесь: прежний путь лучше, то есть дальше искать 
         // нечего, поэтому игнорируем этот шаг 
     } 
} 
 
// Поиск кратчайшего пути от transit до finish 
void FindWay( Graph& g, int transit, int finish ) 
{ 
   if( transit == finish ) return; 
 
   // Находим дуги, исходящие из transit и 
   // выполняем шаг по каждой найденной дуге 
   for( int ixArc=0; ixArc < g.numArcs; ixArc++ ) 
   { 
   // Рассматриваем случай орграфа, поэтому анализируем 
   // только исходящую вершину дуги 
   if( g.arcs[ ixArc ].from == transit ) 
   ForStep( g, ixArc ); 
  } 
  return; // Больше путей нет 
}
East Undia Trading вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск маршрута в графе. vedro-compota Общие вопросы по программированию, компьютерный форум 4 16.04.2013 09:23
Определить степени вершин графа и если граф однородный - вывести степень однородности(любой язык) serg0 Помощь студентам 0 18.02.2013 23:31
Графы. Удаление вершин в графе. morozixa939 Помощь студентам 1 20.12.2012 21:12
Поиск в графе Selebro Общие вопросы C/C++ 0 14.12.2008 17:06
Поиск разделяющих вершин в произвольном графе... Agnazar Помощь студентам 4 29.05.2008 22:51