瀏覽代碼

test_dimcas.cpp

jkunlin 8 年之前
父節點
當前提交
7eefbefe22
共有 2 個文件被更改,包括 166 次插入7 次删除
  1. 0 7
      example.txt
  2. 166 0
      test_dimacs.cpp

+ 0 - 7
example.txt

@@ -1,7 +0,0 @@
-5
-   2   2   1   3   2
- 0 1 1 0 0
- 1 0 0 0 1
- 1 0 0 1 0
- 0 0 1 0 1
- 0 1 0 1 0

+ 166 - 0
test_dimacs.cpp

@@ -0,0 +1,166 @@
+// =====================================================================================
+//
+//       Filename:  test_dimacs.cpp
+//
+//    Description:  test if the instance contain loop or multi edge
+//
+//        Version:  1.0
+//        Created:  2017年 12月 28日 星期四 06:27:25 -00
+//       Revision:  none
+//       Compiler:  g++
+//
+//         Author:  Jinkun Lin, jkunlin@gmail.com
+//   Organization:  School of EECS, Peking University
+//
+// =====================================================================================
+#include <iostream>
+#include <fstream>
+#include <vector>
+#include <algorithm>
+using namespace std;
+
+vector<vector<int>> adjacency_list;
+vector<int> vertex_weight;
+// read graph file into adjacency_list
+void fast_read(string file_name) {/*{{{*/
+	ifstream in_file(file_name);
+	if (!in_file) {
+		cout << "in_file error" << endl;
+		exit(1);
+	}
+	in_file.seekg (0, in_file.end);
+	size_t file_len = in_file.tellg();
+	in_file.seekg (0, in_file.beg);
+	char *data = new char [file_len];
+
+	in_file.read(data, file_len);
+	in_file.close();
+
+	//skip comments
+	char *pos = data;
+	while (*pos == '%') {
+		while(*(pos++) != '\n');
+	}
+
+	//read vertex_count
+	int vertex_count = 0, edge_count = 0;
+	while (*pos < '0' || *pos > '9') {
+		++pos;
+	}
+	while (*pos != ' ') {
+		vertex_count = vertex_count * 10 +  *pos - '0';
+		++pos;
+	}
+	//read edge_count
+	while (*pos < '0' || *pos > '9') {
+		++pos;
+	}
+	while (*pos >= '0' && *pos <= '9') {
+		edge_count = edge_count * 10 +  *pos - '0';
+		++pos;
+	}
+
+	//read vertex_weight
+	vertex_weight.resize(vertex_count + 1);
+	int v,w;
+	for(vector<vector<int>>::size_type i=1; i<vertex_weight.size(); ++i){
+		v = w = 0;
+		//read vertex
+		while (*pos < '0' || *pos > '9') {
+			++pos;
+		}
+		while (*pos != ' ') {
+			v = v * 10 +  *pos - '0';
+			++pos;
+		}
+		//read weight
+		while (*pos < '0' || *pos > '9') {
+			++pos;
+		}
+		while (*pos >= '0' && *pos <= '9') {
+			w = w * 10 +  *pos - '0';
+			++pos;
+		}
+		vertex_weight[v]=w;
+	}
+
+	//read adjacency_list
+	adjacency_list.resize(vertex_count + 1);
+
+	vector<int> vertex_degree(vertex_count + 1, 0);
+	char *stash_pos = pos;
+	int v1, v2;
+	for (int i = 0; i < edge_count; ++i) {
+		v1 = v2 = 0;
+		//read v1
+		while (*pos < '0' || *pos > '9') {
+			++pos;
+		}
+		while (*pos != ' ') {
+			v1 = v1 * 10 +  *pos - '0';
+			++pos;
+		}
+		//read v2
+		while (*pos < '0' || *pos > '9') {
+			++pos;
+		}
+		while (*pos >= '0' && *pos <= '9') {
+			v2 = v2 * 10 +  *pos - '0';
+			++pos;
+		}
+		vertex_degree[v1]++;
+		vertex_degree[v2]++;
+	}
+	for (size_t v = 1; v < adjacency_list.size(); ++v) {
+		adjacency_list[v].reserve(vertex_degree[v]);
+	}
+	pos = stash_pos;
+	for (int i = 0; i < edge_count; ++i) {
+		v1 = v2 = 0;
+		//read v1
+		while (*pos < '0' || *pos > '9') {
+			++pos;
+		}
+		while (*pos != ' ') {
+			v1 = v1 * 10 +  *pos - '0';
+			++pos;
+		}
+		//read weight
+		while (*pos < '0' || *pos > '9') {
+			++pos;
+		}
+		while (*pos >= '0' && *pos <= '9') {
+			v2 = v2 * 10 +  *pos - '0';
+			++pos;
+		}
+		adjacency_list[v1].push_back(v2);
+		adjacency_list[v2].push_back(v1);
+	}
+	delete[] data;
+}/*}}}*/
+
+void test() {
+	for (size_t v = 1; v < adjacency_list.size(); ++v) {
+		std::sort(adjacency_list[v].begin(), adjacency_list[v].end());
+		for (size_t i = 0; i < adjacency_list[v].size(); ++i) {
+			if (adjacency_list[v][i] == (int)v) {
+				std::cout << "loop" << std::endl;
+				abort();
+			}
+			if (i > 0 && adjacency_list[v][i] == adjacency_list[v][i - 1]) {
+				std::cout << "multi edge" << std::endl;
+				abort();
+			}
+		}
+	}
+}
+
+int main(int argc, char const *argv[]) {
+	if (argc != 2) {
+		std::cout << "usage" << std::endl;
+		return 1;
+	}
+	fast_read(argv[1]);
+	test();
+	return 0;
+}