Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Алгоритм] Кубический подграф. 
:(
    Опции темы
rusmgn
Дата 22.5.2010, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 22.5.2010

Репутация: нет
Всего: нет



Условие. Задан граф G=<V,E>
Вопрос. Существует ли в E непустое подмножество E' такое, что в графе G'=<V,E'> любая вершина имеет степень, равную 3 или 0?  [C++]

 Есть алгоритм, нужно проверить корректен ли он, и если нет, то исправить.  По возможности добавить комментарии.
 

#include <iostream.h>
#include <fstream.h>

struct Stack
{
 int v,u;
 int numb;
 bool key;
 Stack *next;
};

int n,m;
bool KEY=false;
typedef Stack* TStack;

TStack push(TStack , int ,int);
TStack pop(TStack);
void Build(TStack);
void OutPut(TStack);
void decrease(TStack ,int);
void increase(TStack ,int);
int deg(TStack,int);
TStack START;
bool K_check(TStack);
bool K_gen(int );
//---------------------------------------------------------------------------
int main()
{
fstream fin("3.TXT");
fin>>n;
fin>>m;

START=new Stack[n+1];
for(int w=0;w<n;w++)
START[w].next =NULL;

Build(START);    // построение списка графов
OutPut(START);   // вывод списка
cout<<endl<<endl;

for(int i=1;i<n+1;i++)
cout<<i<<" - "<<deg(START,i)<<endl;

if(K_gen(1)) cout<<"KUB";
else cout<<"neKUB";
delete[] START;

cin.get();
return 0;
}
//---------------------------------------------------------------------------

TStack push(TStack START, int v,int numb)
{
TStack q;
q=new Stack;
q->v=v;
q->numb=numb;
q->key=true;
q->next=START;
return q;
}

TStack pop(TStack START)
{
START=START->next;
return START;
}

//Построение списка инцидентности
void Build(TStack START)
{
 fstream fin("3.TXT");
 fin>>n;
 fin>>m;
while(!fin.eof())
   {
   int u,v,numb;
     fin>>u;
     fin>>v;
     fin>>numb;
     START[u-1].next=push(START[u-1].next,v,numb);
     START[v-1].next=push(START[v-1].next,u,numb);
   }
   fin.close();
}

//Вывод списка инцидентности
void OutPut(TStack START)
{
 for(int k=0;k<n;k++)
  {
   cout<<k+1<<" -> ";
   TStack Temp;
   Temp=START[k].next;
  while(Temp!=NULL)
    {if(Temp->key)
      {
        cout<<Temp->v<<" -> ";
       }
     Temp=Temp->next;
     if(Temp==0) cout<<"NIL";
     }
  cout<<endl;}
}

int deg(TStack START, int x)      // степень вершины
{
int V=0;

TStack Temp;
Temp=START[x-1].next;

   while(Temp!=NULL)
     {
     if(Temp->key==true)
     V++;
     Temp=Temp->next;
     }

return V;
}



bool K_check(TStack START)
{
bool k=true;
int x,y=0;
  for(int i=1;i<n+1;i++)
  {
   x=deg(START,i);
   if(x!=3)
     if(x==0) y++; //проверка на степень 0
   else
   {
    k=false;
    break;
   }
  }
if(y==n) k=false; // все изолир
return k;
}

void decrease(TStack START, int NUMB) // понижение степени
{
  TStack Temp=NULL;
  for(int i=0;i<n;i++)
  {
   Temp=START[i].next;
    while(Temp!=NULL)
    {
     if(Temp->numb==NUMB)
      {
       Temp->key=false;
       break;
      }
     Temp=Temp->next;
    }
  }
}

void increase(TStack START, int NUMB)
{
  TStack Temp=NULL;
  for(int i=0;i<n;i++)
  {
   Temp=START[i].next;
    while(Temp!=NULL)
    {
     if(Temp->numb==NUMB)
      {
       Temp->key=true;
       break;
      }
     Temp=Temp->next;
    }
  }
}


bool K_gen(int i)
{
 int j;
 j=i;
 while(j<m+1)
 {
  if(K_check(START))
  {
   KEY=true;
   return KEY;
  }
  else
  {
   decrease(START,j);
   K_gen(j+1);
   increase(START,j);
   j++;
  }

 }
}


Это сообщение отредактировал(а) rusmgn - 28.5.2010, 17:16
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0364 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.