-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathGraph1.cpp
134 lines (115 loc) · 3.76 KB
/
Graph1.cpp
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
#include "Graph1.h"
using namespace std;
Graph1::Graph1(Vertex& vertex, Edges& edges): vertexes(vertex), edges(edges) {
}
Graph1::Graph1() {
}
Graph1::Graph1(const Graph1 &graph) {
vertexes = graph.vertexes;
edges = graph.edges;
}
Graph1 &Graph1::operator=(const Graph1 &graph) {
if (this == &graph){
return *this;
}
vertexes = graph.vertexes;
edges = graph.edges;
return *this;
}
Graph1 operator+(const Graph1 &graph1, const Graph1 &graph2){
Graph1 result;
result.vertexes = graph1.vertexes + graph2.vertexes;
result.edges = graph1.edges + graph2.edges;
return result;
}
Graph1 operator^(const Graph1 &graph1, const Graph1 &graph2) {
Graph1 result;
result.vertexes = graph1.vertexes ^ graph2.vertexes;
result.edges = graph1.edges ^ graph2.edges;
return result;
}
Graph1 operator-(const Graph1 &graph1, const Graph1 &graph2) {
Graph1 result;
result.vertexes = graph1.vertexes - graph2.vertexes;
result.edges = graph1.edges - graph2.edges;
return result;
}
Graph1 operator*(const Graph1 &graph1, const Graph1 &graph2){
Graph1 result;
result.vertexes = graph1.vertexes * graph2.vertexes;
result.edges = graph1.edges * graph2.edges;
return result;
}
Graph1 operator!(const Graph1 &graph1) {
Graph1 result;
result.vertexes = graph1.vertexes;
set<string>::iterator it1 = graph1.vertexes.begin();
for (;it1!=graph1.vertexes.end();it1++){
set<string>::iterator it2 = graph1.vertexes.begin();
for (;it2!=graph1.vertexes.end();it2++){
pair<string,string> temp (*it1,*it2);
if (*it1 == *it2 || graph1.edges.isContain(temp)) {
continue;
}
result.edges.addEdge(temp);
}
}
return result;
}
bool Graph1::checkIfEmpty() {
return vertexes.checkIfEmpty() && edges.checkIfEmpty();
}
bool Graph1::isContain(string vertex) {
return vertexes.isContain(vertex);
}
void Graph1::addVertex(string vertex) {
vertexes.addVertex(vertex);
}
void Graph1::addEdge(pair<string, string> edge) {
edges.addEdge(edge);
}
void Graph1::WriteGraphToFile(Graph1 &graph, string file_name) {
ofstream outfile(file_name, ios_base::binary);
if (!outfile){
throw CantOpenFile();
}
int vertex_num = vertexes.size();
int edge_num = edges.size();
outfile.write((const char*)&vertex_num, sizeof(int));
outfile.write((const char*)&edge_num, sizeof(int));
set<string>::iterator it = vertexes.begin();
string buffer;
for (; it !=vertexes.end(); ++it) {
int size_of_ver = it->length();
outfile.write((const char*)&size_of_ver, sizeof(int));
buffer = *it;
int length = buffer.size() +1 ;
char *buffer1 = new char [length];
copy(buffer.begin(),buffer.end(),buffer1);
buffer1[length-1] = '\0';
outfile.write(buffer1,buffer.length());
buffer.clear();
delete[] buffer1;
}
set<pair<string,string>>::iterator it1 = edges.begin();
for (; it1 !=edges.end(); ++it1) {
buffer = it1->first;
int size_of_edge = buffer.length();
outfile.write((const char*)&size_of_edge, sizeof(int));
int length = buffer.size() +1;
char *buffer2 = new char[length];
copy(buffer.begin(),buffer.end(),buffer2);
buffer2[length-1] = '\0';
outfile.write(buffer2,buffer.length());
delete[] buffer2;
buffer = it1->second;
size_of_edge = buffer.length();
outfile.write((const char*)&size_of_edge, sizeof(int));
length = buffer.length() + 1;
char *buffer3 = new char[length];
copy(buffer.begin(),buffer.end(),buffer3);
buffer3[length-1] = '\0';
outfile.write(buffer3,buffer.length());
delete[] buffer3;
}
}