Форум программистов, компьютерный форум CyberForum.ru

Графы на С++ - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Определить все ходы для белой шашки. http://www.cyberforum.ru/cpp-beginners/thread53781.html
На шашечном поле в произвольном порядке расставлены шашки. Для выбранной пользователем белой шашки определить все ее возможные ходы. Учесть, что за один шаг белая шашка может сбить несколько черных шашек.Нужно использовать рекурсию. Вот сижу и думаю как эту рекурсию использовать и в каком месте.Что это такое я интуитивно догадываюсь,немного порылся в нете,но применить к данной задаче не...
C++ как сделать правильно указатель на первую функцию #include "stdafx.h" #include "stdio.h" #include "conio.h" int F(int n) { if(n==0) return 1; if(n==1) return 1; return (n+(n-1)); } int _tmain(int argc, _TCHAR* argv) http://www.cyberforum.ru/cpp-beginners/thread53770.html
Что такое NULL ? C++
Обьясните, что значит NUL часто вижу его в условиях и операторах а что это значит точто не знаю!!!
Капли дождя C++
Здравствуйте!!! Помогите пожалуйста сделать на консольном окне капли дождя(то есть как льет дождь). Нужно чтобы они падали как на землю!!! Спасибо заранее!!!
C (СИ) C - Функция scanf() http://www.cyberforum.ru/cpp-beginners/thread53741.html
И снова я.Заранее прошу прощения за такие глупые,возможно,вопросы,но всё же..: #include <stdio.h> #include <conio.h> int main() { int x;
C++ DEV-C++ - виснет компилятор Всем ещё раз привет.Пытаюсь скомпилировать код вида: #include <graphics.h> int main() { initwindow(400,300); // открыть окно для графики подробнее

Показать сообщение отдельно
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,298
03.10.2009, 09:32     Графы на С++
Автор, лови:
Значит, идея такова. Все студенты очевидно разбиваются на группы. Каждая группа- связный список. Формируем связные списки. В конце работы выводятся по одному члену из каждого списка.
Знакомь их между собой и всё.
Одиночки тоже выведутся (если будут). Так что вот.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
#include <stdio.h>
#include <iostream>
using namespace std;
 
 
int main(){
 
 int kol_studentov;
 
 //Это вот один и второй, будем их вводить.
 int odin;
 int vtoroi;
 
 //Вот по этой переменной мы либо выходим из цикла, либо нет. 
 char vihod_i_tsikla;
 
 //Эта штука будет содержать информацию о студенте.
 //Адрес нулевого элемента это адрес нулевого элемента
 //списка, к которому принадлежит студент
 //если адрес указывает в никуда, студнт не принадлежит ни одному из списков
 struct student {
  student* adres_nachalnogo_elementa;
  student* adres_ego_druga;
 }*pstudent;
 
 
 
 cout<<"Вводи количество студентов"<< endl;
 cin>> kol_studentov;
 
 
 
 
 //Это вот под студентов мы объявляем массив
 student* pMassivStudentov= new student [kol_studentov]; 
 
 
 //Все элементы будем обнулять принудительно. Это очень важно!
 for (int i= 0; i< kol_studentov;i++ ) {
  pMassivStudentov[i].adres_nachalnogo_elementa= 0;
  pMassivStudentov[i].adres_ego_druga= 0;
 }
 printf ("&pMassivStudentov[0]=  %d\n\n", &pMassivStudentov[0]);
 
 
 
 //Будем формировать связные списки.
 //По окончании задачи нас будет интересовать только один какой-нибудь 
 //элемент каждого связного списка
 //Допустим, организовалось 5 групп (5 связных списков) и 3 свободных студента
 //Пусть номера ПОСЛЕДНИХ (почему последних- объяснение внизу.) элементов в связных списках 1, 2, 34, 23, 5
 //Пусть номера свободных студентов 7, 20, 56
 //Тогда вот тебе минимальное количество пар-знакомств, чтобы все были знакомы друг с другом.
 //1- 2, 2-34, 34- 23, 23- 5, 5- 7, 7-20, 20-56
 
 //Главное- правильно заполнить массив pMassivStudentov
 //В путь!
 
 
 while (1) {
 
  cout<< "Вводи пару"<< endl;
  cin>>odin;
  cin>>vtoroi;
   
  //Рассмотрим имеющиеся у нас связные списки и наличие в них первогои второго студентов
  //Варианты: 
  //1) если студенты не присутствуют ни в каких списках, составляем из них
  //новый связный список
  //2) ЕСли студенты присутствуют в одном каком-нибудь списке, то ничё не делем.
  //3) если студенты присутствуют в разных списках, "соединяем эти списки"
  //4) Если какой-то из студентов присутствует в каком-нибудь списке, то присоединяем второго
  //к этому списку
  //фишка в том, что ни один студент не может присутствовать более, чем в одном связном списке
 
    
  //Теперь вопрос- как узнать, принадлежит студент к какому-нибудь связному списку?
  //Правильно, надо посмотреть на adres_nachalnogo_elementa
  //на поле adres_ego_druga смотреть не надо, т. к. если чел последним в списке, то
  //оно также будет указыватьв никуда, как если бы он ни в каком списке не состоял
  
  //сюда идём, если первый чел состоит в каком-нибудь связном списке
  if (pMassivStudentov[odin].adres_nachalnogo_elementa) {
 
   //Cюда идём, если второй чел состоит в этом же связном списке
   if (pMassivStudentov[odin].adres_nachalnogo_elementa==pMassivStudentov[vtoroi].adres_nachalnogo_elementa) {
    //Кстати, тут ничё делать не надо. Исправлять не буду. Зато иллюстративно
   }
 
   //сюда идём, если второй чел не стостоит в том списке, что и первый.
   //кстати, не факт, что второй состоит в каком-нибудь списке
   else     {
 
    //Сюда идём, если второй чел состоит в списке, отличным от того, в каком состоит первый
    //Тут фишка в том, что если он вобще
    //нигде не состоит, то выполняются одни и те же действия, как если бы он состоял в 
    //каком-нибудь списке ВоТ они
    //Значит, их надо запихать в один список. Соединить то есть списки.
    //делаем это так
    //Берём список, которому принадлежит студент odin и добираемся до его последнего элемента
    //И вот здесь нам понадобится pstudent
    pstudent= &pMassivStudentov[odin];
    while (pstudent->adres_ego_druga)
     pstudent=pstudent->adres_ego_druga;
 
    //Всё, теперь pstudent указыват на последний элемент в списке
    //Теперь делаем так
    pstudent->adres_ego_druga= &pMassivStudentov[vtoroi];
      
    //Всё, связный список сформирован
    //Теперь в элементах, что раньше принадлежали второй половине списка, исправим поля
    //adres_nachalnogo_elementa и всё на этом
    pstudent= &pMassivStudentov[vtoroi];
    pstudent->adres_nachalnogo_elementa= pMassivStudentov[odin].adres_nachalnogo_elementa;
    while (pstudent->adres_ego_druga) {
     pstudent=pstudent->adres_ego_druga;
     pstudent->adres_nachalnogo_elementa= pMassivStudentov[odin].adres_nachalnogo_elementa;
    }
    ; 
 
   }
  }   
 
  //а сюда идём, если не состоит (первый)
  else {
 
   //сюда пойдём, если второй чел состоит в каком-нибудь списке
   if (pMassivStudentov[vtoroi].adres_nachalnogo_elementa) {
    //Действия описывать не буду, они уже выше описаны, толко там наоборот было
    //Первый состоял в спписке. а второй нет
    pstudent= &pMassivStudentov[vtoroi];
    while (pstudent->adres_ego_druga)
     pstudent=pstudent->adres_ego_druga;
    pstudent->adres_ego_druga= &pMassivStudentov[odin];
    pstudent= &pMassivStudentov[odin];
    pstudent->adres_nachalnogo_elementa= pMassivStudentov[vtoroi].adres_nachalnogo_elementa;
    while (pstudent->adres_ego_druga) {
     pstudent=pstudent->adres_ego_druga;
     pstudent->adres_nachalnogo_elementa= pMassivStudentov[vtoroi].adres_nachalnogo_elementa;
    }
   }
 
   //а сюда пойдём, если не состоит ни тот, ни другой
   //значит, формируем из них двух связный список
   else {
    pMassivStudentov[odin].adres_nachalnogo_elementa=&pMassivStudentov[odin];
    pMassivStudentov[odin].adres_ego_druga=&pMassivStudentov[vtoroi];
    pMassivStudentov[vtoroi].adres_nachalnogo_elementa=&pMassivStudentov[odin];
   }
  } 
  
 
 
  //Так, здесь смотрим, будем вводить дальше пару или нет
  cout<< "Работаем дольше? (y или любой другой знак)"<< endl;
  fflush (stdin);
  if (vihod_i_tsikla= getchar ()!= 'y') 
   break;
 }
 
 //Всё. Теперь пробегаемя по всем связным спискам и из каждого берём по одному студенту.
 //Делается это так.
 //Только у последних студентов всех связных списков поле adres_ego_druga
 //указывает в никуда
 //Кроме того,в никуда оно указывает и у всех свободных студентв
 //Короче,  берём тех студентов, у уоторых это поле указывает в никуда, знакомими
 //их меж собой и всё, аля-улю, гони гусей.
 
 cout<< "Лови номера студентов. Ты их уж перезнакомь как-нибудь сам..."<< endl;
 
 for (int i= 0; i< kol_studentov; i++) {
  if (!pMassivStudentov[i].adres_ego_druga) {
   printf ("%d   ", i);
  }
 }
 printf ("\n");
 getchar ();
 getchar ();
 return 0;
}
Добавлено через 28 минут
Добавление. В моём коде слабое место это ввод. Ну, то есть он безошибочен, но громоздко сделан.
Это потому, что я не шарю в cin вообще!
valeriikozlov, простите. Ситуация такая. Если имеется 8 студентов, разбитых на такие группы знакомых:
0, 1, 2, 3, 4, 5 и 6, 7, 8

Это мне по приглашению ввести количество знакомых пар, чего вводить надо?
Ну, то есть, я хотел сказать, что ВООБЩЕ количество знакомых пар тут равно 18 (в первой группе 15 и во второй 3). То есть подсчитывать нужно будет всегда вручную?
Впрочем, я уверен, что неправильно Вас понял и Вы этот вопрос проясните.
 
Текущее время: 07:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru