Selaa lähdekoodia

дорешал

miket 1 vuosi sitten
vanhempi
commit
852d0739ef
3 muutettua tiedostoa jossa 83 lisäystä ja 21 poistoa
  1. 76 19
      graph/graph.cpp
  2. 6 2
      graph/graph.h
  3. 1 0
      graph/main.cpp

+ 76 - 19
graph/graph.cpp

@@ -74,29 +74,14 @@ void Graph::remove_edge(Node* begin, Node* end)
 }
 
 
-
-
-int get_number_from_string(int start, string word) {
-	int dec = 1, res = 0;
-	while (start>=0 && word[start] >= 48 && word[start] <= 57 ) {
-		res += ((word[start] - 48) * dec);
-		dec *= 10;
-		start--;
-	}
-	return res;
-
-
-}
-
-
 void Graph::read_file(string file_name)
 {
 
 	ifstream input;
 	input.open(file_name);
-	map <string, Node> saved;
 	if (input.is_open()) {
 		string line;
+
 		getline(input, line);
 		while (getline(input, line)) {
 			string fir = "", sec = "";
@@ -112,14 +97,22 @@ void Graph::read_file(string file_name)
 				sec += line[splitter];
 				splitter++;
 			}
+			
+
+
 
 
 			saved[fir] = taken_names[fir] ? saved[fir] : Node(fir);
 			saved[sec] = taken_names[sec] ? saved[sec] : Node(sec);
 
-
-			add_node(&saved[fir]);
-			add_node(&saved[sec]);
+			try {
+				add_node(&saved[fir]);
+			}
+			catch (Graph_exception & ex) {}	
+			try {
+				add_node(&saved[sec]);
+			}
+			catch (Graph_exception & ex) {}
 
 			add_edge(&saved[fir], &saved[sec]);
 
@@ -130,6 +123,70 @@ void Graph::read_file(string file_name)
 		}
 
 	}
+	input.close();
+
+}
+
+
+
+
+void Graph::write_graph(vector <vector <node_iterator> > ind)
+{
+	int size = ind.size();
+	for (int i = 0; i < size; i++) {
+		
+		string c_name = "graph";
+		c_name += (i + 49);
+		c_name += ".txt";
+
+		ofstream out(c_name);
+		for (int j = 0; j < ind[i].size(); j++) {
+			Node * const cur = *ind[i][j];
+			node_iterator it = cur->neighboors.begin();
+			while (it != cur->neighboors.end()) {
+				Node* const neighb = *it;
+				out << cur->name << '\t' << neighb->name << '\n';
+				it++;
+			}
+			
+		}
+		out.close();
+	}
+}
+
+void Graph::find_independent_graphs()
+{
+	int size = nodes.size();
+	vector <vector <node_iterator> > independent;
+	set<Node*> working_nodes = nodes;
+
+
+	for (int i = 0; i <size; i++) {
+		
+		set<Node*>::iterator it = working_nodes.begin(), compared = working_nodes.begin();
+		vector<node_iterator> tmp_nodes;
+		tmp_nodes.push_back(nodes.find(*it));
+
+		BFS fs(*this);
+		compared++;
+		while (compared != working_nodes.end()) {
+			
+			if(fs.connected(*it, *compared))
+				tmp_nodes.push_back(nodes.find(*compared));
+			compared++;
+
+		}
+
+		independent.push_back(tmp_nodes);
+
+		for (int i = 0; i < tmp_nodes.size(); i++) {
+			working_nodes.erase(working_nodes.find(*tmp_nodes[i]));
+			size--;
+		}
+	}
+
+	write_graph(independent);
+
 
 }
 

+ 6 - 2
graph/graph.h

@@ -3,6 +3,8 @@
 #include <map>
 #include <set>
 #include <fstream>
+#include <vector>
+#include <iostream>
 
 using namespace std;
 class Node {
@@ -46,16 +48,18 @@ class Graph
 	typedef set<Node*>::const_iterator node_iterator;
 private:
 	map <string, bool> taken_names;
+	map <string, Node> saved;
 	set<Node*> nodes;
-	
+	void write_graph(vector <vector <node_iterator> > ind);
 public:
 	Graph() {};
 	void add_node(Node* node);
 	void remove_node(Node* node);
 	void add_edge(Node* begin, Node* end);
 	void remove_edge(Node* begin, Node* end);
-
+	//çàäàíèå 
 	void read_file(string file_name);
+	void find_independent_graphs();
 
 
 	node_iterator begin() {

+ 1 - 0
graph/main.cpp

@@ -13,6 +13,7 @@ int main()
 {
     Graph gr;
     gr.read_file("testgraph.txt");
+    gr.find_independent_graphs();
     cout << "END \n";
 }