//Список рёбер
// QList<Edge> bufferVertex;
std::vector<Edge> bufferVertex;
//Потом максимальной степени вершины
maxDegree = 4;
//нужно 2 булевы переменные
bool f;
//Окрашенные рёбра, colorEdges[i] - цвет, colorEdges[i][j] - ребро
// QList< QList<Edge> > colorEdges;
std::vector<std::vector<Edge>> colorEdges(maxDegree);
for (int i = 0; i < colorEdges.size(); i++){
colorEdges[i].reserve(bufferVertex.size());
}
//Потом максимальной степени вершины
// int *colors = new int[bufferVertex.size()];
// for (int i = 0; i < bufferVertex.size(); i++)
// colors[i] = 0;
std::vector<int> colors(bufferVertex.size(), 0);
do
{
f = false;
//Перебор возможный комбинаций цветов
for (int i = 0; i < colors.size(); i++)
if (colors[i] != maxDegree-1)
{
colors[i]++;
for (int j = i - 1; j > -1; j--)
colors[j] = 0;
break;
}
//Окраска в текущую комбинация цветов
// colorEdges.clear();
//удалять объекты внутри не надо, а просто их чистим
for (int i = 0; i < colorEdges; i++){
colorEdges[i].clear();
}
for (int i = 0; i < bufferVertex.size(); i++){
colorEdges[colors[i]].push_back(bufferVertex[i]);
//нужен ли этот 2ой цикл снизу, может достаточно проверять только последнее вставленное значени?
//for (int j = 0; j < colorEdges[i].size()-1 && !f; j++){
// auto start_j = colorEdges[i][j].getStart();
// auto end_j = colorEdges[i][j].getEnd();
// auto start_k = colorEdges[i].back().getStart();
// auto end_k = colorEdges[i].back().getEnd();
// f = start_j==start_k || start_j == end_k || end_j == start_k || end_j==end_k;
// }
for (int j = 0; j < colorEdges[i].size() && !f; j++)
for (int k = j + 1; k < colorEdges[i].size() && !f; k++)
{
// if ((colorEdges[i][j].getStart() == colorEdges[i][k].getStart()) ||
// (colorEdges[i][j].getStart() == colorEdges[i][k].getEnd()) ||
// (colorEdges[i][j].getEnd() == colorEdges[i][k].getStart()) ||
// (colorEdges[i][j].getEnd() == colorEdges[i][k].getEnd()))
// f = true;
auto start_j = colorEdges[i][j].getStart();
auto end_j = colorEdges[i][j].getEnd();
auto start_k = colorEdges[i][k].getStart();
auto end_k = colorEdges[i][k].getEnd();
f = start_j==start_k || start_j == end_k || end_j == start_k || end_j==end_k;
}
}
if (f) //Если окрасился неправильно, проверяем не закончился ли счётчик
{
f = false;
for (int i = 0; i < bufferVertex.size() && !f; i++)
f = colors[i] != (maxDegree - 1);
}
} while (f);
class A
{
private:
char* ptr;
int size;
public:
A(char* initial){/*allocate etc*/}
~A(){/*deallocate etc*/}
//конструктор копирования
A(const A& other) {
size = other.size;
ptr = new char[size];
memcpy(ptr, other.ptr, size ); }
//конструктор перемещения
A(A&& other) {
size = other.size;
ptr = other.ptr;
other.size = 0;
other.ptr = nullptr; }
#if _WIN32_WINNT >= 0x0600
WINBASEAPI WINBOOL WINAPI GetQueuedCompletionStatusEx (HANDLE CompletionPort, LPOVERLAPPED_ENTRY lpCompletionPortEntries, ULONG ulCount, PULONG ulNumEntriesRemoved, DWORD dwMilliseconds, WINBOOL fAlertable);
WINBASEAPI WINBOOL WINAPI CancelIoEx (HANDLE hFile, LPOVERLAPPED lpOverlapped);
map<pair<int, int>, int> result;
get_parse(val1, val2, val3);
result[std::make_pair(val1, val2)] += val3;
#include <iostream>
#include <algorithm>
#include <thread>
template<typename T>
T func (T& tid) {
std::cout << "Thread says: " << tid << std::endl;
return tid;
}
int main ()
{
unsigned val = 35;
std::thread t (func<decltype(val)>, val);
t.join ();
system ("pause");
return 0;
}
template<typename InputType, typename LeftContainer, typename RightContainer, typename UnaryPredicate>
void OddEven(InputType input,LeftContainer left, RightContainer right, UnaryPredicate pred)
{
for (auto key:input)
{
if (pred(key))
left.push_back(key);
else
right.push_back(key);
}
}