朋友圈——计算省份数量【php版】

47 篇文章 1 订阅

在这里插入图片描述

三种方法:BFS 、 DFS 、并查集

<?php
class Solution {
	private $visited = [];

	private $parent = null;
	private $provCnt = null;

	/**
	 * DFS
	 * @param Integer[][] $isConnected
	 * @return Integer
	 */
	function findCircleNum($isConnected) {
		$provCnt = count($isConnected);
		if ($provCnt == 0) {
			return 0;
		}
		$this->visited = array_fill(0, $provCnt, false);

		$i = 0;
		$cnt = 0;
		while($i < $provCnt) {
			if (!$this->visited[$i]) {
				$this->dfs($isConnected, $i);
				$cnt++;
			}
			$i++;
		}
		return $cnt;
	}

	function dfs(&$isConnected, $i) {
		$this->visited[$i] = true;
		foreach ($isConnected[$i] as $j => $_flgConn) {
			if ($_flgConn == 1 && !$this->visited[$j]) {
				$this->dfs($isConnected, $j);
			}
		}
	}

	/**
	 * BFS
	 * @param Integer[][] $isConnected
	 * @return Integer
	 */
	function findCircleNumv2($isConnected) {
		$provCnt = count($isConnected);
		if ($provCnt == 0) {
			return 0;
		}
		$visited = array_fill(0, $provCnt, false);

		$i = 0;
		$cnt = 0;
		while($i < $provCnt) {
			if (!$visited[$i]) {
				$queue = new SplQueue();
				$queue->enqueue($i);
				while (!$queue->isEmpty()) {
					$provIdx = $queue->dequeue();
					$visited[$provIdx] = true;
					foreach ($isConnected[$provIdx] as $j => $flgConn) {
						if ($flgConn == 1 && !$visited[$j]) {
							$queue->enqueue($j);
						}
					}
				}
				$cnt++;
			}
			$i++;
		}
		return $cnt;

	}

	/**
	 * 并查集
	 * @param Integer[][] $isConnected
	 * @return Integer
	 */
	function findCircleNumv3($isConnected) {
		$provCnt = count($isConnected);
		if ($provCnt == 0) {
			return 0;
		}
		$this->provCnt = $provCnt;
		// 创建并查集
		for ($i=0; $i<$provCnt; $i++) {
			$this->parent[$i] = $i;
		}

		for ($i=0; $i<$provCnt; $i++) {
			for ($j=$i+1; $j<$provCnt; $j++) {
				if ($isConnected[$i][$j] == 1) {
					$this->union($i, $j);
				}
			}
		}
		return $this->provCnt;
	}

	function union($i, $j) {
		$i = $this->find($i);
		$j = $this->find($j);
		if ($i != $j) {
			$this->provCnt--;
		}
		$this->parent[$j] = $i;
	}

	function find($idx) {
		while ($this->parent[$idx] != $idx) {
			$idx = $this->parent[$idx];
		}
		return $idx;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值