2020华为软挑总结——复赛方案一code

2023-05-16

#include<iostream>
#include<fstream>
//#include<list>
#include<vector>
//#include<queue>
#include <sstream>
#include<assert.h>
#include<unordered_map>
#include<map>
#include<algorithm>
#include<string>
//#include<list>
#include<set>
#include <chrono>
#include <thread>
#include<future>
//#include<atomic>
#include<mutex>
//#include<mman.h>
//#include <sys/mman.h>


#include<sys/mman.h>
#include<sys/types.h>
#include<fcntl.h>
#include<unistd.h>
#include<string.h>

using namespace std;


#define TEST
#define THREAD_NUM 4

typedef unsigned int uint;








/**/

//定义一个计时器类
class Timer
{
public:
	Timer() : beg_(clock_::now()) {}
	void reset() { beg_ = clock_::now(); }
	double elapsed() const {
		return std::chrono::duration_cast<second_>
			(clock_::now() - beg_).count();
	}
	void out(std::string message = "") {
		double t = elapsed();
		std::cout << message << " elasped time:" << t << "s\n";
		reset();
	}
private:
	typedef std::chrono::high_resolution_clock clock_;
	typedef std::chrono::duration<double, std::ratio<1> > second_;
	std::chrono::time_point<clock_> beg_;
};


//定义一个储存环的类
struct MyContainer
{
	int base[7] = { 0 };

	int rear = 0;

	void push_back(int& i)
	{
		base[rear] = i;
		++rear;

	}
	/*
		void out(ofstream& fout)
		{
			for (int i = 0; i < rear - 1; ++i)
			{
				fout << base[i] << ",";
			}
			fout << base[rear - 1];
		}


		bool operator<(MyContainer& ms2)
		{

			if (rear == ms2.rear)
			{
				for (int i = 0; i < rear; ++i)
				{
					if (base[i] == ms2.base[i])
					{
						continue;
					}
					return base[i] < ms2.base[i];
				}
			}
			else
			{
				return  rear < ms2.rear;
			}
		}*/
};

struct ArcTNode
{
	int arc;
	unsigned int money;
	bool operator<(ArcTNode& ms2)const
	{
		return arc < ms2.arc;
	}

};


struct VerTNode
{//顶点结构体
	unsigned int vex; //顶点信息
	char id_char[12];
	//list<ArcTNode> arcs; //用列表表示邻接矩阵的一行
	//int arcs[30] = { 0 }; // [0~14]的空间存放边的顶点值。
	vector<ArcTNode> arcs;
	vector<ArcTNode> arcs_reverse;

	//bool visited = false;
	//bool checked = false;
	/**************未知位置预分配空间*******************
	VerTNode()
	{

		arcs.reserve(100);
		arcs_reverse.reserve(100);
		vex = 0;
	}
	~VerTNode() {}*/

};


struct vector_3
{
	unsigned int value[3];
};

//最终答案
struct m_answer {
	char c[80] = {};
};

//
class AdjListGraph
{
public:
	vector<vector_3> tmp_arcs;
	VerTNode* vexs; //vector向量存储图所有顶点的全部信息
	int node_set_size;
	
	vector<m_answer> result[THREAD_NUM][5];
	vector<uint> result_stat[THREAD_NUM][5];
	uint answer_len[THREAD_NUM];
	
	//vector< vector< >>

	//vector<unsigned int> tmp_ms[THREAD_NUM]; //记录单个环
	vector<unsigned int> node_set;
	unordered_map<unsigned int, int> node_map;
	MyContainer tmp_ms[THREAD_NUM];
	//MyContainer tmp_ms1; //记录单个环  第一个线程使用。
	//MyContainer tmp_ms2; //记录单个环  第二个线程使用。
	//MyContainer tmp_ms3; //记录单个环  第三个线程使用。
	//unordered_set<int> blockedSet;
	//unordered_set<int> blockedSet1;
	/*
	std::mutex mu;

	void result_push_back(MyContainer& tmp_ms)
	{
		mu.lock();
		result.push_back(tmp_ms);//将单个环加入result之中
		mu.unlock();
	}*/


	void my_itoa(char* buf, unsigned int val)
	{
		unsigned int vals[10] = {};
		int len = 0;
		do
		{
			vals[len] = val % 10;
			val /= 10;
			++len;
		} while (val > 0);

		--len;
		char* p = buf;
		do
		{
			*p = vals[len] + '0';
			++p;
			--len;

		} while (len >= 0);
		*p = ',';
		++p;
		*p = '\0';
	}

	inline void ui2S(MyContainer& a, vector<m_answer>& b, vector<uint>& c, const uint& thread_index)
	{
		c.push_back(a.base[0]);
		m_answer s_temp;
		char* p1 = s_temp.c;
		char* p2 = NULL;
		for (unsigned int i = 0; i < a.rear; ++i)
		{
			p2 = vexs[a.base[i]].id_char;///
			while (*p2 != '\0')
			{
				*p1 = *p2;
				++p1;
				++p2;
			}
		}
		*p1 = '\0';
		--p1;
		*p1 = '\n';
		answer_len[thread_index] += strlen(s_temp.c);
		b.push_back(s_temp);
	}




	inline bool check(unsigned int& x, unsigned  int& y)const
	{

		return x <= 5ll * y && y <= 3ll * x;

	}
	//int ii = THREAD_NUM * (THREAD_NUM + 1);
	void FC(const int& NUM)// //主线程
	{
		//unsigned int  k = 0, k1 = 0, k2 = 0, k3 = 0, k4 = 0, k5 = 0, k6 = 0, k7 = 0;
		int pp1 = 0, pp2 = 0, pp3 = 0, pp4 = 0, pp5 = 0, pp6 = 0, pp7 = 0;
		unsigned int m1 = 0, m2 = 0, m3 = 0, m4 = 0, m5 = 0, m6 = 0, m7 = 0;
		//vector<bool> Visited(node_set_size, false);
		bool* Visited = new bool[node_set_size];
		bool* Neighborhood_3 = new bool[node_set_size];


		//int mei_fen = ;
		//金字塔形状分配各线程数据量
		//for (int i = NUM * (NUM + 1) * node_set_size / ii; i <= (NUM + 2) * (NUM + 1) * node_set_size / ii - 1; ++i)

			//平均分配
		//for (int i = NUM * node_set_size / THREAD_NUM; i <= node_set_size * (NUM + 1) / THREAD_NUM - 1; ++i)
		for (int i = NUM; i < node_set_size; i += THREAD_NUM)
		{
			//vector<bool> Neighborhood_3(node_set_size,false);
			//Neighborhood_3(node_set_size, false);
			/*******************反向寻找3邻域的点*********************/
			for (int ip = 0; ip < node_set_size; ++ip)
			{
				//if (Neighborhood_3[ip])
				{
					Neighborhood_3[ip] = false;
				}
			}
			//第一层
			//k = vexs[i].vex;
			//tmp_ms[NUM].push_back(k);
			//vexs[i].visited = true;
			//blockedSet.insert(i);
			Visited[i] = true;
			Neighborhood_3[i] = true;

			for (int j1 = 0; j1 < vexs[i].arcs_reverse.size(); ++j1)
			{
				pp1 = vexs[i].arcs_reverse[j1].arc;
				if (pp1 <= i)
				{
					continue;
				}
				//m1 = vexs[i].arcs_reverse[j1].money;
				//k1 = vexs[pp1].vex;


				第二层
				//tmp_ms[NUM].push_back(k1);
				//vexs[pp1].visited = true;
				//blockedSet.insert(pp1);
				Visited[pp1] = true;
				Neighborhood_3[pp1] = true;

				for (int j2 = 0; j2 < vexs[pp1].arcs_reverse.size(); ++j2)
				{
					pp2 = vexs[pp1].arcs_reverse[j2].arc;
					//m2 = vexs[pp1].arcs_reverse[j2].money;
					//k2 = vexs[pp2].vex;
					if (pp2 <= i)//|| !check(m2, m1)
					{
						continue;
					}
					第三层

					//tmp_ms[NUM].push_back(k2);
					//vexs[pp2].visited = true;
					//blockedSet.insert(pp2);
					Visited[pp2] = true;
					Neighborhood_3[pp2] = true;

					for (int j3 = 0; j3 < vexs[pp2].arcs_reverse.size(); ++j3)
					{
						pp3 = vexs[pp2].arcs_reverse[j3].arc;
						//m3 = vexs[pp2].arcs_reverse[j3].money;
						//k3 = vexs[pp3].vex;

						//|| !check(m3, m2)
						if (Visited[pp3] || pp3 <= i)//blockedSet.find(pp3) != blockedSet.end()
						{
							continue;
						}
						//Visited[pp3] = true;
						Neighborhood_3[pp3] = true;

					}
					//Visited[pp3] = false;


					//tmp_ms[NUM].rear -= 1;//第三层
					//vexs[pp2].visited = false;
					//blockedSet.erase(pp2);
					Visited[pp2] = false;

				}
				//tmp_ms[NUM].rear -= 1;//第二层
				//vexs[pp1].visited = false;
				//blockedSet.erase(pp1);
				Visited[pp1] = false;
			}
			//tmp_ms[NUM].rear -= 1;//第一层
			//vexs[i].visited = false;
			//blockedSet.erase(i);
			Visited[i] = false;






			/*******************正向循环找环*********************/
			//第一层
			//k = vexs[i].vex;
			tmp_ms[NUM].push_back(i);
			//vexs[i].visited = true;
			//blockedSet.insert(i);
			Visited[i] = true;
			for (int j1 = 0; j1 < vexs[i].arcs.size(); ++j1)
			{
				pp1 = vexs[i].arcs[j1].arc;
				if (pp1 <= i)
				{
					continue;
				}
				m1 = vexs[i].arcs[j1].money;
				//k1 = vexs[pp1].vex;

				第二层
				tmp_ms[NUM].push_back(pp1);
				//vexs[pp1].visited = true;
				//blockedSet.insert(pp1);
				Visited[pp1] = true;
				for (int j2 = 0; j2 < vexs[pp1].arcs.size(); ++j2)
				{
					pp2 = vexs[pp1].arcs[j2].arc;
					if (pp2 <= i)
					{
						continue;
					}
					m2 = vexs[pp1].arcs[j2].money;
					//k2 = vexs[pp2].vex;
					if (!check(m1, m2))
					{
						continue;
					}
					第三层

					tmp_ms[NUM].push_back(pp2);
					//vexs[pp2].visited = true;
					//blockedSet.insert(pp2);
					Visited[pp2] = true;
					for (int j3 = 0; j3 < vexs[pp2].arcs.size(); ++j3)
					{
						pp3 = vexs[pp2].arcs[j3].arc;
						if (pp3 < i)
						{
							continue;
						}
						m3 = vexs[pp2].arcs[j3].money;
						//k3 = vexs[pp3].vex;

						if (pp3 == i)
						{
							if (!check(m2, m3))
							{
								continue;
							}
							if (!check(m3, m1))
							{
								continue;
							}
							//result[0][NUM].push_back(tmp_ms[NUM]);//将单个环加入result之中
							//result_push_back(tmp_ms);
							ui2S(tmp_ms[NUM], result[NUM][0], result_stat[NUM][0], NUM);

							continue;
						}
						if (Visited[pp3])//blockedSet.find(pp3) != blockedSet.end()
						{
							continue;
						}
						if (!check(m2, m3))
						{
							continue;
						}

						第四层
						tmp_ms[NUM].push_back(pp3);
						//vexs[pp3].visited = true;
						//blockedSet.insert(pp3);
						Visited[pp3] = true;
						for (int j4 = 0; j4 < vexs[pp3].arcs.size(); ++j4)
						{
							pp4 = vexs[pp3].arcs[j4].arc;
							if (pp4 < i || !Neighborhood_3[pp4])
							{
								continue;
							}
							m4 = vexs[pp3].arcs[j4].money;
							//k4 = vexs[pp4].vex;

							if (pp4 == i)
							{
								if (!check(m3, m4))
								{
									continue;
								}
								if (!check(m4, m1))
								{
									continue;
								}

								//result[1][NUM].push_back(tmp_ms[NUM]);//将单个环加入result之中
								//result_push_back(tmp_ms);
								ui2S(tmp_ms[NUM], result[NUM][1], result_stat[NUM][1], NUM);

								continue;
							}
							if (Visited[pp4])
							{
								continue;
							}
							if (!check(m3, m4))
							{
								continue;
							}
							/**/
							第五层
							tmp_ms[NUM].push_back(pp4);
							//vexs[pp4].visited = true;
							//blockedSet.insert(pp4);
							Visited[pp4] = true;
							for (int j5 = 0; j5 < vexs[pp4].arcs.size(); ++j5)
							{
								pp5 = vexs[pp4].arcs[j5].arc;
								if (pp5 < i || !Neighborhood_3[pp5])
								{
									continue;
								}
								m5 = vexs[pp4].arcs[j5].money;
								//k5 = vexs[pp5].vex;

								if (pp5 == i)
								{
									if (!check(m4, m5))
									{
										continue;
									}
									if (!check(m5, m1))
									{
										continue;
									}

									//result[2][NUM].push_back(tmp_ms[NUM]);//将单个环加入result之中
									//result_push_back(tmp_ms);
									ui2S(tmp_ms[NUM], result[NUM][2], result_stat[NUM][2], NUM);
									continue;
								}
								if (Visited[pp5])
								{
									continue;
								}
								if (!check(m4, m5))
								{
									continue;
								}
								第六层
								tmp_ms[NUM].push_back(pp5);
								//vexs[pp5].visited = true;
								//blockedSet.insert(pp5);
								Visited[pp5] = true;
								for (int j6 = 0; j6 < vexs[pp5].arcs.size(); ++j6)
								{
									pp6 = vexs[pp5].arcs[j6].arc;
									if (pp6 < i || !Neighborhood_3[pp6])
									{
										continue;
									}
									m6 = vexs[pp5].arcs[j6].money;
									//k6 = vexs[pp6].vex;


									if (pp6 == i)
									{
										if (!check(m5, m6))
										{
											continue;
										}
										if (!check(m6, m1))
										{
											continue;
										}

										//result[3][NUM].push_back(tmp_ms[NUM]);//将单个环加入result之中
										//result_push_back(tmp_ms);
										ui2S(tmp_ms[NUM], result[NUM][3], result_stat[NUM][3], NUM);

										continue;
									}
									if (Visited[pp6])
									{
										continue;
									}
									if (!check(m5, m6))
									{
										continue;
									}
									第七层
									tmp_ms[NUM].push_back(pp6);
									//vexs[pp6].visited = true;
									//blockedSet.insert(pp6);
									Visited[pp6] = true;
									for (int j7 = 0; j7 < vexs[pp6].arcs.size(); ++j7)
									{
										pp7 = vexs[pp6].arcs[j7].arc;
										if (pp7 < i || !Neighborhood_3[pp7])
										{
											continue;
										}
										m7 = vexs[pp6].arcs[j7].money;
										//k7 = vexs[pp7].vex;


										if (pp7 == i)
										{
											if (!check(m6, m7))
											{
												continue;
											}
											if (!check(m7, m1))
											{
												continue;
											}

											//result[4][NUM].push_back(tmp_ms[NUM]);//将单个环加入result之中
											//result_push_back(tmp_ms);
											ui2S(tmp_ms[NUM], result[NUM][4], result_stat[NUM][4], NUM);

											continue;
										}
										/*if (Visited[pp7] )
										{
											continue;
										}
										if (!check(m6, m7))
										{
											continue;
										}*/
										第八层
										//tmp_vec.push_back(j);
										//vexs[j].visited = true;


									}
									//tmp_ms[NUM].pop_back();
									tmp_ms[NUM].rear -= 1;//第七层
									//vexs[pp6].visited = false;
									//blockedSet.erase(pp6);
									Visited[pp6] = false;

								}
								//tmp_ms[NUM].pop_back();
								tmp_ms[NUM].rear -= 1;//第六层
								//vexs[pp5].visited = false;
								//blockedSet.erase(pp5);
								Visited[pp5] = false;


							}
							//tmp_ms[NUM].pop_back();
							tmp_ms[NUM].rear -= 1;//第五层
							//vexs[pp4].visited = false;
							//blockedSet.erase(pp4);
							Visited[pp4] = false;

						}
						//tmp_ms[NUM].pop_back();
						tmp_ms[NUM].rear -= 1;//第四层
						//vexs[pp3].visited = false;
						//blockedSet.erase(pp3);
						Visited[pp3] = false;

					}
					//tmp_ms[NUM].pop_back();
					tmp_ms[NUM].rear -= 1;//第三层
					//vexs[pp2].visited = false;
					//blockedSet.erase(pp2);
					Visited[pp2] = false;

				}
				//tmp_ms[NUM].pop_back();
				tmp_ms[NUM].rear -= 1;//第二层
				//vexs[pp1].visited = false;
				//blockedSet.erase(pp1);
				Visited[pp1] = false;
			}
			//tmp_ms[NUM].pop_back();
			tmp_ms[NUM].rear -= 1;//第一层
			//vexs[i].visited = false;
			//blockedSet.erase(i);
			Visited[i] = false;
		}

		delete[] Visited;
		delete[] Neighborhood_3;
	}
	/*
		void FindCycle()
		{
			for (size_t i = 0; i < THREAD_NUM; i++)
			{
				FC(i);
			}
		}
	*/
	AdjListGraph()
	{
		/******************预分配空间******************
		size_t i;
		tmp_arcs.reserve(2000000);
		for (size_t i = 0; i < 2000000; ++i)
		{
			tmp_arcs[i].resize(3);
		}


		for (i = 0; i < 5; ++i)
		{

			for (size_t j = 0; j < THREAD_NUM; ++j)
			{
				result[i][j].reserve(200000);
			}

		}*/

		/******************未知的位置不预分配空间************************/
		for (size_t i = 0; i < THREAD_NUM; i++)
		{
			answer_len[i] = 0;
		}

	}
	~AdjListGraph()
	{
		delete[]vexs;
	}

	//建图
	void CreateFromFile(string& FileName)
	{//由数据文件FileName创建图

		

		//size_t i;

		//打开文件,fd为文件描述符
		int fd = open(FileName.c_str(), O_RDONLY);
		//cout << "fd   " << fd << endl;

		//文件长度
		int len = lseek(fd, 0, SEEK_END);
		//cout << "len   " << len << endl;

		//文件映射
		char* data = (char*)mmap(NULL, len, PROT_READ, MAP_PRIVATE, fd, 0);

		//关闭文件,若放在此处不行就放在文件末尾munmap函数之前
		close(fd);

		auto p_end = data;
		//unsigned int num_s[3];//用来存放数据

		vector_3 value;

		tmp_arcs.reserve(2000000);
		node_set.reserve(4000000);

		while (*p_end != '\0')
		{
			for (short int i = 0; i < 3; ++i)
			{
				value.value[i] = strtoul(p_end, &p_end, 10);//将char数组转换为unsigned int类型,保存在数组num_s中
				++p_end;
				if (i < 2)
				{
					//node_set.insert(tmp_arcs[tmp_arcs_size][i]);
					//node_set[node_set_size++] = tmp_arcs.data_line[tmp_arcs_size][i];
					//node_set.insert(value.value[i]);
					node_set.push_back(value.value[i]);
				}
			}
			//tmp_arcs_size += 1;

			tmp_arcs.push_back(value);
		}
		// 解除映射,释放空间
		munmap(data, len);

		sort(node_set.begin(), node_set.end());
		node_set.erase(unique(node_set.begin(), node_set.end()), node_set.end());


		node_set_size = node_set.size();
		//vexs.resize(node_set_size);

		vexs = new VerTNode[node_set_size];

		//auto temp_iter = node_set.begin();

		size_t i;
		for (i = 0; i < node_set_size; ++i)
		{
			/*vexs[i].vex = *temp_iter;
			node_map[*temp_iter] = i;
			++temp_iter;*/

			vexs[i].vex = node_set[i];
			//转换为字符串存在
			my_itoa(vexs[i].id_char, node_set[i]);

			node_map[node_set[i]] = i;
			
		}


		int j, k;
		ArcTNode aa;
		for (i = 0; i < tmp_arcs.size(); ++i)
		{

			k = node_map[tmp_arcs[i].value[0]];
			j = node_map[tmp_arcs[i].value[1]];
			aa.money = tmp_arcs[i].value[2];


			//正向
			aa.arc = j;
			vexs[k].arcs.push_back(aa);

			//反向
			aa.arc = k;
			vexs[j].arcs_reverse.push_back(aa);
		}

		for (i = 0; i < node_set_size; i++)
		{
			sort(vexs[i].arcs.begin(), vexs[i].arcs.end());
		}

	}


	//输出结果
	void PrintResult(string& outFileName)
		/*********************写入文件+交替写入+mmap写+***********************/
		//void PrintResult_mmap_X(string& FileName)
	{



		//3、输出
		uint size[5] = { 0,0,0,0,0 };
		uint total_size = 0;
		for (uint i = 0; i < THREAD_NUM; ++i)
		{
			for (uint j = 0; j < 5; ++j)
			{
				size[j] += result[i][j].size();
				total_size += result[i][j].size();
				//cout << result[j][i].size() << "\t";
			}
			//cout << "\n";
		}



#ifdef TEST
		/**/
		cout << "Cycle Total  " << total_size << "\n";
		/**/
		for (int j = 0; j < THREAD_NUM; ++j)
		{
			for (int i = 0; i < 5; ++i)
			{
				cout << result[i][j].size() << "\t";
			}
			cout << "\n";
		}
#endif // TEST
		//cout << "result size:" << total_size << endl;

		//Timer time2;
		//5、进行输出

		string total_size_s = to_string(total_size) + "\n";
		int len = total_size_s.size() + 1;
		for (int i = 0; i < THREAD_NUM; ++i)
		{
			len += answer_len[i];
		}

		// 打开文件
		int fd = open(outFileName.c_str(), O_RDWR | O_CREAT, 0666);
		//先给文件申请一个大小,写入一个字符进行保证
		lseek(fd, len - 1, 0);


		//cout << len << endl;



		write(fd, "h", 1);//可能就是这个文件搞的鬼
		// 使用mmap函数建立内存映射
		char* addr = (char*)mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

		// 内存映射建立好了,此时可以关闭文件了
		close(fd);
		auto iter = addr;


		memcpy(addr, total_size_s.c_str(), total_size_s.size());
		addr += total_size_s.size();

		//交替进行输出
		uint t[THREAD_NUM];
		uint process_id = 0;
		for (uint i = 0; i < 5; ++i)
		{
			for (uint j = 0; j < THREAD_NUM; ++j)
				t[j] = 0;

			process_id = 0;
			while (size[i])
			{
				for (uint j = 0; j < THREAD_NUM; ++j)
				{
					while (t[j] < result_stat[j][i].size() && result_stat[j][i][t[j]] == process_id)
					{

						memcpy(addr, result[j][i][t[j]].c, strlen(result[j][i][t[j]].c));
						addr += strlen(result[j][i][t[j]].c);

						++t[j];
						--size[i];
					}
					++process_id;

				}
			}
		}
		memcpy(addr, "\n", 1);
		munmap(iter, len);
	}
};


int main()
{
	
#ifdef TEST
	Timer timer;
	Timer timer1;
#endif // TEST

	AdjListGraph g;
	

#ifdef TEST
	//定义输入文件路径
	//定义输入文件路径
	//string s = "test_data28W.txt";//697518
	//string s = "test_data.txt";//43
	//string s = "test_data1.txt";//9153
	//string s = "test_data2.txt";//1004812
	//string s = "minidata.txt"; //3
	string s = "test_data_196.txt";//19630345
	//定义输出文件路径
	string outFileName = "result.txt";
	g.CreateFromFile(s);
#endif // TEST
#ifndef TEST
	/******************比赛用的输入文件******************/
	string s = "//data//test_data.txt";//文件地址//data//test_data.txt /***************************/
	g.CreateFromFile(s);//建邻接表结构图  //Total elasped time:0.166665s
	/*******************比赛用的输出文件**********************/
	string outFileName = "//projects//student//result.txt";projects//student//************************/

#endif // !TEST

#ifdef TEST
	timer1.out("CreateGraph");
	Timer timer2;
#endif // TEST


	多线程找环
#if THREAD_NUM==1
	g.FC(THREAD_NUM - 1);
#endif // THREAD_NUM==1
#if THREAD_NUM!=1
	size_t i;
	std::future <void> m[THREAD_NUM - 1];
	//std::thread t[THREAD_NUM - 1];
	for (i = 0; i < THREAD_NUM - 1; ++i)
	{
		//t[i] = std::thread(&AdjListGraph::FC, &g, i);
		m[i] = std::async(&AdjListGraph::FC, &g, i);
	}
	g.FC(THREAD_NUM - 1);
	for (i = 0; i < THREAD_NUM - 1; ++i)
	{
		m[i].wait();
		//t[i].join();
	}
#endif // THREAD_NUM!=1


#ifdef TEST
	timer2.out("FindCycle");
	Timer timer3;
#endif // TEST

	
	g.PrintResult(outFileName);//输出结果
	

#ifdef TEST
	timer3.out("SaveFile");
	timer.out("Total");
#endif // TEST


	return 0;

}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2020华为软挑总结——复赛方案一code 的相关文章

  • CSDN上代码块背景颜色的设置

    CSDN上代码块背景颜色的设置 今天发博客的时候发现代码块背景的颜色是白色的 xff0c 我想要改成黑色的 xff0c 于是就研究了一下怎么修改代码块背景的颜色 xff0c 修改代码块的背景颜色只要4步 1 点击个人头像打开管理博客 2 在
  • 模拟电路和数字电路PCB设计的区别

    本文就旁路电容 电源 地线设计 电压误差和由PCB布线引起的电磁干扰 EMI 等几个方面 xff0c 讨论模拟和数字布线的基本相似之处及差别 工程领域中的数字设计人员和数字电路板设计专家在不断增加 xff0c 这反映了行业的发展趋势 尽管对
  • k8s部署资源服务的注意事项

    前言 为了k8s的资源服务能够高效 稳定 健康的运转 xff0c 需要对其进行相应的设置 资源类别 声明每个Pod的resource 在使用k8s集群时 xff0c 经常会遇到 xff1a 在一个节点上调度了太多的Pod xff0c 导致节
  • OCR中有见解的评论

    一 关于人脑与计算机识别的区别 电脑识别最主要是依赖简单的线性分类问题 把20 20个像素直接展成400维向量 xff0c 分类之 虽然现在的算法越来越常见地引入了非线性 xff0c 但是这种非线性的复杂度还是远没法和人脑相比 人脑则是多层
  • 梯度响应图——针对无纹理目标的检测

    题目 xff1a Gradient response maps for real time detection of textureless objects amp emsp xff1b gt amp ensp xff1b gt amp n
  • 深度学习技术在语义分割中的应用综述

    论文题目 xff1a A Review on Deep Learning Techniques Applied to Semantic Segmentation 博客园上的翻译 知乎上的提取 CSDN上的总结1 CSDN上的总结2
  • A Survey on Optical Character Recognition System 光学字符识别系统综述

    论文题目 xff1a 2017 A Survey on Optical Character Recognition System 摘要 光学字符识别 xff08 OCR xff09 是近年来研究的热点 它被定义为将文档图像数字化为其组成字符
  • 数据结构算法与解析(STL版含源码)

    文章目录 第1章 线性表1 1 顺序存储结构1 1 1 顺序表1 1 2 vector线性表 STL的顺序存储结构 1 2 链式存储结构1 2 1 单链表1 2 2 双向循环链表1 2 3 list线性表 STL的链式存储结构 1 3 静态
  • C++后台开发面试题集绵

    文章目录 一 C 43 43 语言1 引用和指针的区别 xff1f 3 C 43 43 中指针参数传递与引用参数传递 xff1f 4 形参与实参的区别 xff1f 5 static的用法和作用 xff1f 6 静态变量什么时候初始化 xff
  • 计算机网络

    文章目录 第一章 概述小结局域网 广域网 Internet网络通信 xff08 OSI模型 xff09 xff1a 计算机网络的性能指标 xff1a 第二章 物理层小结物理层的基本概念数据通信的基础知识基带与带通 xff1a 常用编码 xf
  • mysql使用和优化

    取当天0点0分 xff0c 下一天0点0分 UNIX TIMESTAMP获取时间戳 timestamp获取时间 select UNIX TIMESTAMP date sysdate timestamp adddate date sysdat
  • 数据库系统

    文章目录 第1章 概论第2章 基本知识与关系模型1 数据库 数据库管理系统 数据库系统什么是数据库什么是数据库系统什么是数据库管理系统DBMS小结 2 数据库系统的结构抽象与演变数据库系统的标准结构3 数据模型4 数据库系统的演变与发展5
  • 操作系统(学习笔记)

    文章目录 1 什么是操作系统2 操作系统的启动3 操作系统的接口4 系统调用的实现5 操作系统的历史6 我们的任务8 CPU管理9 多进程图像1 读写PCB xff0c OS中最重要的结构 xff0c 贯穿始终 2 要操作寄存器完成切换 x
  • 2020华为软挑总结

    文章目录 一 热身赛编程闯关 xff1a 评价标准 xff1a 问题分析 二 初赛问题描述评价标准 xff1a 问题分析思路一 xff1a 思路二 xff1a 思路三 xff1a 针对思路三的提速 xff1a 最终结果 xff1a 三 co
  • Linux命令总结之目录命令

    文章目录 Linux 目录命令1 96 ls 96 命令2 96 cd 96 命令3 96 pwd 96 命令4 96 mkdir 96 命令5 96 rm 96 命令6 96 mv 96 命令7 96 cp 96 命令8 96 cat 9
  • Markdown 公式指导手册

    Markdown 公式指导手册
  • Linux学习

    文章目录 一 基础入门二 Linux 命令总结一 Linux 目录命令 https blog csdn net weixin 42715287 article details 105825021 二 Linux 文件管理命令 https e
  • Linux命令总结之文件管理命令

    文章目录 二 Linux 文件管理命令1 96 which 96 命令到底什么是命令 xff1f 2 96 whereis 96 命令3 96 locate 96 命令4 96 find 96 命令5 96 xargs 96 命令 二 Li
  • Linux命令总结之文本编辑命令

    文章目录 Linux 文本编辑命令1 96 wc 96 命令2 96 grep 96 命令3 96 正则表达式 96 命令4 96 cut 96 命令5 96 paste 96 命令6 96 tr 96 命令7 96 sort 96 命令8
  • Linux命令总结之Linux 磁盘管理命令

    文章目录 Linux 磁盘管理命令1 96 df 96 命令2 96 du 96 命令3 96 time 96 命令 Linux 磁盘管理命令 1 df命令 linux 中 df 命令的功能是用来检查 linux 服务器的文件系统的磁盘空间

随机推荐

  • linux基础操作之一

    文章目录 1 基本概念及操作常用快捷键 xff1a 2 用户及文件权限管理1 Linux 用户管理1 查看用户 xff1a 2 创建账户 xff1a 3 用户组4 删除用户和用户组5 鲲鹏服务器安装 96 perf 96 6 阿里云服务器安
  • 重庆思庄Linux技术分享-linux中VDO的使用

    VDO xff08 Virtual Data Optimize虚拟数据优化 xff09 通过压缩或删除存储设备上的数据来优化存储空间 VDO层放置在现有块存储设备例如RAID设备或本地磁盘的顶部 这些块设备也可以是加密设备 存储层 xff0
  • 排序算法之快排

    1 快排 快速排序算法的关键在于先在数组中选一个数字 xff0c 接下来把数组中的数字分成两部分 span class token comment achieve quick sorting span span class token ma
  • 排序算法之归并排序

    充分利用了把大问题转化成一个个小的子问题的思想 xff08 由迭代或递归来实现 xff09 span class token comment achieve merge sorting span span class token macro
  • 排序算法之堆排序(附源码)

    1 将顺序存储的数据看成是一颗完全二叉树 2 对于大顶堆 xff0c 确保每棵子树的根节点都是整个子树中的最大值 xff1b 这就保证了根节点是所有数据中的最大值 xff0c 但不保证所有数据有序 span class token comm
  • LED灯源控制

    1 LED五种调光控制方式详解 LED的发光原理同传统照明不同 xff0c 是靠P N结发光 xff0c 同功率的LED光源 xff0c 因其采用的芯片不同 xff0c 电流电压参数则不同 xff0c 故其内部布线结构和电路分布也不同 xf
  • LED驱动电路的分析

    文章目录 一 方案一 1 电路工作原理 2 组件选择 3 个人分析 二 方案二 在方案一的基础上改进 1 电路工作原理 2 个人分析 三 方案三 在方案一的基础上改进 1 电路工作原理 2 个人分析 参考连接 常见驱动电路的分析 一 方案一
  • linux基础操作之二

    文章目录 6 文件解压与打包1 概念讲解2 实战1 zip 压缩打包程序2 使用 unzip 命令解压缩 zip 文件3 tar 打包工具4 总结 7 文件系统操作与磁盘管理1 查看磁盘和目录的容量2 dd 命令简介3 使用 dd 命令创建
  • mmap的使用

    参考资料 mmap 函数 xff1a 原理与使用 含代码 mmap函数使用与实例详解 Linux系统编程 xff1a mmap使用技巧 mmap和普通文件读写的区别和比较 amp mmap的注意点 认真分析mmap xff1a 是什么 为什
  • LED高效恒流驱动电源的设计指导书

    参考链接 LED高效恒流驱动电源的设计指导书 LED灯驱动电源设计 LED恒流驱动电路 精 LED恒流驱动电路 led灯驱动电源电路图 led灯的驱动原理电路图方案详解 KIA MOS管 一 LED驱动电源原理 1 由于LED的光特性通常都
  • 恒流源驱动电路 随笔一

    方案一 参考论文 LED光源驱动电路研究 华科 硕士 08 06 采用恒流源控制的原因 1 LED的PN结的温度系数为负 温度升高时LED的势垒电势降低 由于这个特点 所以LED不能直接用电压源供电 必须采用限流措施 否则LED随着工作时温
  • 恒流源驱动电路 随笔二

    参考论文 LED的驱动电路研究 大理 硕士 07 06 三个简单方案 电荷泵驱动的典型电路 CAT3604是一个工作在1x 1 5x分数模式下的电荷泵 可调节每只LED白光管脚 xff08 共4只LED管脚 xff09 的电流 使背光的亮度
  • gcc编译c文件常用命令参数解释

    gcc编译c文件 gcc是常用来编译c语言程序的编译器 xff0c 了解它编译c语言的命令参数 xff0c 对c c 43 43 语言的学习是有一定好处的 gcc编译文件一步到位的命令格式 gcc main c o main exe 设置了
  • 恒流源驱动电路 随笔三

    参考论文一 LED蓝绿光黄疸光疗系统的研究与设计 天工 硕士 15 12 AMC7150是一种仅需 xff15 个外部零件的高功率LED驱动IC AMC7150内建P xff37 xff2d 和功率晶体管 xff0c 工作频率可达200kH
  • 光源系统厂商、结构

    参考论文 基于PWM的LED机器视觉光源技术的研究 哈工大 硕士 span class token number 2009 span fpga 前言 机器视觉系统包括 xff1a 照明 镜头 相机 图像采集卡 视觉处理器 led光源分为两大
  • LED驱动IC厂家

    厂家芯片类别 世微半导体 英飞凌Infineon 壹芯半导体科技 xff08 深圳 xff09 有限公司 欧司朗OSRAM xff1a 汽车照明 深圳天微电子有限公司 中铭电子 深圳市华芯光电有限公司 宁波欧特电子科技有限公司 芯片介绍 l
  • 2D/3D模板匹配

    2D 对象 正交视图 物体的组成部分之间的角度和距离可以改变 xff0c 不需要缩放 需要缩放 存在遮挡 杂乱或颜色 物体的特征是具有特定的纹理 xff0c 而不是清晰可见的轮廓 图像高度散焦 对象变化显著 期望物体轮廓的局部变形 xff0
  • linux基础操作之三

    文章目录 10 命令执行顺序控制与管道命令执行顺序的控制1 顺序执行多条命令2 有选择的执行命令 管道3 1 试用3 2 cut 命令 xff0c 打印每一行的某一字段3 3 grep 命令 xff0c 在文本中或 stdin 中查找匹配字
  • 2020华为软挑总结——baseline

    span class token macro property span class token directive keyword include span span class token string lt bits stdc 43
  • 2020华为软挑总结——复赛方案一code

    span class token macro property span class token directive keyword include span span class token string lt iostream gt s