00001 #include "stdafx.h" 00002 #include "Random.h" 00003 #include "Graph.h" 00004 00005 Graph::Graph() 00006 { 00007 } 00008 00009 Graph::Graph( int nodeNum, int edgeNum ) 00010 { 00011 int i,j; 00012 00013 // create nodes 00014 for( i=0; i<nodeNum; ++i ) 00015 { 00016 Node * n = new Node(60, 40); 00017 m_nodes.push_back( n ); 00018 } 00019 00020 // create random edges 00021 while( true ) 00022 { 00023 Node * nodeFrom = m_nodes[Random::nextInt(nodeNum)]; 00024 Node * nodeTo = m_nodes[Random::nextInt(nodeNum)]; 00025 00026 // check if we already have that edge 00027 for( j=0; j<m_edges.size(); ++j ) 00028 { 00029 Edge * e2 = m_edges[j]; 00030 if(e2->m_nodeFrom == nodeFrom && e2->m_nodeTo == nodeTo) 00031 break; 00032 } 00033 if( j==m_edges.size() ) 00034 { 00035 Edge * e = new Edge( nodeFrom, nodeTo ); 00036 m_edges.push_back( e ); 00037 nodeFrom->m_edges.push_back( e ); 00038 if( nodeFrom != nodeTo ) 00039 nodeTo->m_edges.push_back( e ); 00040 if( m_edges.size() == edgeNum ) 00041 break; 00042 } 00043 } 00044 00045 fillSubGraphField(); 00046 } 00047 00048 Graph::~Graph() 00049 { 00050 clear(); 00051 } 00052 00053 int Graph::getNumberOfSubGraphs() 00054 { 00055 return m_numberOfSubGraphs; 00056 } 00057 00058 void Graph::fillConnectedToOthersFiled() 00059 { 00060 for( int i=0; i<m_nodes.size(); ++i ) 00061 { 00062 Node * n = m_nodes[i]; 00063 n->m_connectedToOthers = false; 00064 for( int j=0; j<n->m_edges.size(); ++j ) 00065 { 00066 if( n->m_edges[j]->m_nodeFrom != n || n->m_edges[j]->m_nodeTo != n ) 00067 { 00068 n->m_connectedToOthers = true; 00069 break; 00070 } 00071 } 00072 } 00073 } 00074 00075 void Graph::fillSubGraphFieldForOneNode( Node * n, int subGraph ) 00076 { 00077 n->m_subGraph = subGraph; 00078 for( int i=0; i<n->m_edges.size(); ++i ) 00079 { 00080 Node * n2 = n->m_edges[i]->getTopLevelFrom(); 00081 if( n2 == n ) 00082 n2 = n->m_edges[i]->getTopLevelTo(); 00083 if( n2 != n && n2->m_subGraph == -1 ) 00084 fillSubGraphFieldForOneNode( n2, subGraph ); 00085 } 00086 } 00087 00088 void Graph::fillSubGraphField() 00089 { 00090 int i; 00091 00092 fillConnectedToOthersFiled(); 00093 00094 for( i=0; i<m_nodes.size(); ++i ) 00095 { 00096 m_nodes[i]->m_subGraph = -1; 00097 m_nodes[i]->m_nodeId = i; 00098 } 00099 00100 m_numberOfSubGraphs = 0; 00101 for( i=0; i<m_nodes.size(); ++i ) 00102 { 00103 if( m_nodes[i]->m_subGraph == -1 && m_nodes[i]->m_connectedToOthers ) 00104 { 00105 fillSubGraphFieldForOneNode(m_nodes[i],m_numberOfSubGraphs); 00106 m_numberOfSubGraphs++; 00107 } 00108 } 00109 } 00110 00111 void Graph::clear() 00112 { 00113 int i; 00114 00115 for( i=0; i<m_nodes.size(); ++i ) 00116 delete m_nodes[i]; 00117 for( i=0; i<m_edges.size(); ++i ) 00118 delete m_edges[i]; 00119 00120 m_nodes.clear(); 00121 m_edges.clear(); 00122 }