原文链接
原题链接
思路
只要两个部门之间连通,不管是发送消息还是接收消息,那么这两个部门都能知道彼此的存在。
由某个部门进行dfs的过程中,访问到的所有其它的部门, 那么这两个部门都是互相知道的。在dfs的过程中标记这两个部门连通,即finds[root][now]=finds[now][root]=1
。注意是双向知晓的,不要只记录一个方向的。
所有节点进行dfs遍历,即可。
代码
前几次提交错误的原因是,我用vector容器来存放知道的部门,这样就会重复的入队。导致一分都木的。然后我用set容器(我原来注释掉的地方),这样就不会有重复的可能性啦。但是运行超时了。能用简单的数据结构解决的,就不要套用复杂的数据结构,有超时的危险。
倒数第二次得0分的原因是,我申请finds数组的大小是10010*10010。然后运行就出错了。下次还是看清题目,空间够用就好。
#include <bits/stdc++.h>
using namespace std;
vector<int> v[10010];//存放n个部门的邻接表
//set<int> finds[10010];//存放每个部门知道的其它部门
bool visited[10010];
int finds[1010][1010];
//从节点i进行深度优先遍历