算法导论(22.1-6)-基本图算法-有向图的通用汇点

算法导论(22.1-6)-基本图算法-有向图的通用汇点

题目描述:给定图G的邻接矩阵表示,给出一个O(v)时间的算法来判断有向图G是否存在一个通用汇点。通用汇点是指入度为|V|-1且出度为0的结点。
思路:
首先可以证明一个有向图G如果有通用汇点,那么他仅有一个。假设有两个,则根据定义(入度为|V|-1),这两个结点必定互通的,这就违反了定义(出度为0),矛盾!
然后下面这个算法尝试寻找一个可能的候选结点:

//i表示行,j表示列
int i = 0;
int j = 0;
//从(0,0)开始搜索,如果当前矩阵元素为1,i++,如果为0,j++
while(j < |V|){
	if(G[i][j] == 1){
		i++;
	}else{
		j++;
	}
}

我们用循环不变式证明上面算法能找到一个可能的通用汇点:
循环不变式保持下面3个特性:
1、i是一个可能的通用汇点
2、1到i-1都不可能是通用汇点
3、1到j-1(除了i)都不可能是通用汇点

初始时,i = 0,j = 0,0结点是可能的通用汇点,上面1,2,3条都是显然成立的。
现在假设循环前为(i, j),满足1,2,3条,一次循环后:
如果G[i][j]为1,那么表示第i个结点有出度,这表明第i个结点不可能是通用汇点。i变为i+1,i+1是可能的通用汇点,1-i都不可能,1到j-1仍然都不可能是通用汇点。
如果G[i][j]为0,如果i不等于j,则表示结点j的入度不可能为|V|-1,j不可能为通用汇点,j+1,i没有变化,3条特性成立;如果i等于j,那么G[i][j]为0不能判定j结点不是通用汇点,所以第3条中要出去i(i等于j)。
综上,循环不变式可以保持。该部分最坏情况是i一直加到|v|,j也加到|v|,时间复杂度为O(2|v|),即O(|v|)
当j从0遍历完 |V|后,根据条件3和条件1就可以知道,1到|v|(除了i)都不可能是通用汇点,我们此时只要验证i结点到底是不是通用汇点就可,具体做法是看看矩阵第i行是不是全为0,第i列是不是除了第i行外全为1,如果满足,则G有唯一通用汇点i,否则,G不存在通用汇点。这部分显然时间复杂度为O(2|v|),即O(|v|)
综上,总的时间复杂度为O(|v|)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值