题目
分析
这道题看着像并查集,但并不是。并查集的特性告诉我们,最终能得到有几个独立的集合,但这些独立的集合是“隔离”的,和题意中要求的“所有奶牛都能到”的要求相悖。
我是倒过来想的:
如果我们已经能知道每头奶牛i
能到的所有牧场,那么我们最终对所有牧场进行遍历,看看是不是所有奶牛都能到,统计这些牧场的总数即可。比如按照样本数据:
2 4 4 //2牛,4牧场,4条边
2 //牛1在2
3 //牛2在3
1 2
1 4
2 3
3 4
可以得到这样的图:
flowchart TD
1-->2["2
牛1"] 1-->4 2-->3["3
牛2"] 3-->4
牛1"] 1-->4 2-->3["3
牛2"] 3-->4
显然,这两头牛可以在3/4
这两个点碰头。
- 牛
1
走到3
号点,牛2
不动。 - 牛
1/2
都走到4
号点。
而牛能走到的点,可以用BFS来标记。
答案
思考
- 我这里用了
bitset<牧场数>[牛数]
来快速标记某头牛i
能否访问牧场j
,这样设置和判定时可以不用遍历一个数组,而只要看对应的那一位是否标记即可。
// BFS中
if (!visited[next])
{
visited[next] = true;
reachable[cow].set(next); // 设置对应位为1
q.push(next);
}
//判定是否都能被访问:
if (!reachable[i][j])
{
all_can_reach = false;
break;
}