#include #include #include #include #include #include using namespace std; class Node { public: string name; vector adj; int visited; }; class Edge { public: string name; Node *n1; Node *n2; Edge *reverse; double original; double residual; double flow; }; class Graph { public: Graph(); ~Graph(); void Print(); Node *Get_Node(string &s); Edge *Get_Edge(Node *n1, Node *n2); Node *Source; Node *Sink; vector Nodes; vector Edges; map N_Map; map E_Map; }; void Graph::Print() { Node *n; int i; printf("Source: %s\n", Source->name.c_str()); printf("Sink: %s\n", Sink->name.c_str()); printf("Nodes: "); for (i = 0; i < Nodes.size(); i++) { n = Nodes[i]; printf(" %s", n->name.c_str()); } printf("\n"); } Graph::Graph() { string s, f, t; double cap; Node *n1, *n2; Source = NULL; Sink = NULL; while (cin >> s) { if (s == "SOURCE") { cin >> s; if (Source != NULL) { fprintf(stderr, "Can't specify two sources\n"); exit(1); } Source = Get_Node(s); } else if (s == "SINK") { cin >> s; if (Sink != NULL) { fprintf(stderr, "Can't specify two sinks\n"); exit(1); } Sink = Get_Node(s); } else if (s == "EDGE") { cin >> f >> t >> cap; n1 = Get_Node(f); n2 = Get_Node(t); } } if (Source == NULL) { fprintf(stderr, "No Source.\n"); exit(1); } if (Sink == NULL) { fprintf(stderr, "No Sink.\n"); exit(1); } } Graph::~Graph() { int i; for (i = 0; i < Nodes.size(); i++) delete(Nodes[i]); for (i = 0; i < Edges.size(); i++) delete(Edges[i]); } Node *Graph::Get_Node(string &s) { map ::iterator nit; Node *n; nit = N_Map.find(s); if (nit != N_Map.end()) return nit->second; n = new Node; n->name = s; Nodes.push_back(n); N_Map.insert(make_pair(s, n)); return n; } main() { Graph *g; g = new Graph(); g->Print(); }