找到一个矩阵表示法的有向无权图中的"汇",定义为,入度为|V| - 1,出度为0的顶点.这样的顶点,一个图中只能有一个.或者没有.这个问题,是以前没有接触过的,觉得很有用,所以去写了下.
起初写的东西,很糟糕.我给带出来了,起初的想法,孩子一样纯真.确实效率不高.而且浪费空间.答案给的实现,更多地利用了矩阵的特点.而且从问题的定义出发,逻辑也不难.很不错.
而且,自觉地注释自己写得也不错,都是最近<<代码大全2>>带给我的.非常感激大蓝哥..
不多说了,直接贴吧.非常帅的代码.
判断某顶点是不是汇.
// Ignore to judge range of vertexIndex.
bool GraphRepresentAsAdjacentMatrix ::isSink (const int vertexIndex)
{
if (m_currentSize < m_size)
{
std ::cerr << m_size - m_currentSize << "Vertex(es) has(have) not been input yet, can't execute this operation." << std ::endl ;
return NoUniversalSinkVertex ;
}
// Test V[pointIndex] as a start vertex.
for (int i = 0; i < m_size; ++i)
{
// If it has an outgoing edge.
if (m_matrix[vertexIndex][i] != NotAdjoinTo)
{
return false ;
}
}
// Test V[pointIndex] as an end vertex.
for (int i = 0; i < vertexIndex; ++i)
{
if (NotAdjoinTo == m_matrix[i][vertexIndex])
{
return false ;
}
}
for (int i = vertexIndex + 1; i < m_size; ++i)
{
if (NotAdjoinTo == m_matrix[i][vertexIndex])
{
return false ;
}
}
// Otherwisw V[pointIndex] is a universal sink vertex, return true.
return true ;
}
接下来,找出汇的下标,如果有.并返回.否则返回-1.
int GraphRepresentAsAdjacentMatrix ::indexOfuniversalSink (void)
{
if (m_currentSize < m_size)
{
std ::cerr << m_size - m_currentSize << "Vertex(es) has(have) not been input yet, can't execute this operation." << std ::endl ;
return NoUniversalSinkVertex ;
}
int i = 0 ;
int j = 0 ;
while (i < m_size && j < m_size)
{
// If V[i] has an outgoing edge.
if (m_matrix[i][j] != NotAdjoinTo)
{
// Test next vertex as a start vertex.
++i ;
}
else
{
// Test next vertex as an end vertex.
++j ;
}
}
// If there isn't a vertex has none outgoing edge.
if (m_size == i)
{
return NoUniversalSinkVertex ;
}
// Testing if all vertexes except V[i] has an outgoing edge to V[i]
for (int k = 0; k < i; ++k)
{
// If find a vertex hasn't an outgoing edge to V[i].
if (NotAdjoinTo == m_matrix[k][i])
{
return NoUniversalSinkVertex ;
}
}
for (int k = i + 1; k < m_size; ++k)
{
// If find a vertex hasn't an outgoing edge to V[i].
if (NotAdjoinTo == m_matrix[k][i])
{
return NoUniversalSinkVertex ;
}
}
// Otherwisw, V[i] is the universal sink vertex.
// return the index i of it.
return i ;
}