算法导论22.1-6

  找到一个矩阵表示法的有向无权图中的"汇",定义为,入度为|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 ;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值